繁体   English   中英

带有viewPager重新创建的Android片段

[英]Android fragment with viewPager recreating

使用片段时遇到一些麻烦。 我有一个NavigationDrawer的活动。 当我单击navigationMenu ItemFragment items ,会调用ItemFragment ItemFragment我有一个TabLayoutViewPager有两个片段。

1. GoodsFragment
2. ServiceFragment

问题是当我调用 itemfragment 时,商品和服务片段会在项目片段中重新创建。 我尝试使用 savedInstanceState(true), (false) 并检查 rootview 是否为 null 和许多解决方案,但没有帮助我。 每次创建片段时,都会创建两个额外的片段。 初学者尝试了很多方法但无能为力。 这是我的代码。 并提前致谢。

项目.java

public class Items extends Fragment {

    @Nullable

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fraglayout_items, container, false);
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    //you can set the title for your toolbar here for different fragments different titles
    getActivity().setTitle("Items");
    TabLayout tabLayout = (TabLayout)view.findViewById(R.id.tab_layout);
    tabLayout.addTab(tabLayout.newTab().setText("Goods"));
    tabLayout.addTab(tabLayout.newTab().setText("Services"));
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
    final ViewPager viewPager = (ViewPager) view.findViewById(R.id.pager);
    final PageAdapter adapter = new PageAdapter(getActivity().getFragmentManager(),tabLayout.getTabCount());
    viewPager.setAdapter(adapter);
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
    tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {
            viewPager.setCurrentItem(tab.getPosition());
        }
        @Override
        public void onTabUnselected(TabLayout.Tab tab) {
        }
        @Override
        public void onTabReselected(TabLayout.Tab tab) {
        }
    });
}
}

Service_Fragment.java

public class Service_fragment extends Fragment {
    public Service_fragment(){}
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fraglayout_service, container, false);
    }@Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        //you can set the title for your toolbar here for different fragments different titles
        ItemDatabaseHandler db=new ItemDatabaseHandler(view.getContext());
        ListView sList=(ListView)view.findViewById(R.id.service_list);
        List<ItemDataModel> items = db.getAllServices();
        ArrayList<Map<String, String>> data = new ArrayList<Map<String, String>>();

        for (ItemDataModel item : items) {
            Map<String, String> datum = new HashMap<String, String>(2);
            datum.put("name", item.getName());
            datum.put("price", "\u20B9"+item.getPrice());
            datum.put("available", ""+item.getS_final());
            data.add(datum);
        }

        SimpleAdapter adapter = new SimpleAdapter(view.getContext(), data, R.layout.item_row, new String[] {"name", "price","available"}, new int[] {R.id.item_name, R.id.item_price,R.id.item_available});
        sList.setAdapter(adapter);
    }
}

Goods_fragment.java也保存为类名更改的服务。 还尝试在onDetach销毁项目片段,但没有成功。

主活动.java

包 co.mastersindia.autotax;

import android.annotation.TargetApi;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.design.widget.NavigationView;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener {
    public final static int REQUEST_CODE = 10101;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        displaySelectedScreen(R.id.nav_createinvoice);

    }
    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }


    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        displaySelectedScreen(item.getItemId());
        return true;
    }
    private void displaySelectedScreen(int itemId) {

        //creating fragment object
        Fragment fragment = null;

        //initializing the fragment object which is selected
        switch (itemId) {
            case R.id.nav_createinvoice:
                fragment = new CreateInvoice();
                break;
            case R.id.nav_viewinvoice:
                fragment = new ViewInvoice();
                break;
            case R.id.nav_tax:
                fragment = new Tax();
                break;
            case R.id.nav_items:
                fragment = new Items();
                break;
            case R.id.nav_busmgmt:
                fragment = new BusinessManagement();
                break;
            case R.id.nav_settings:
                Intent i=new Intent(MainActivity.this,SettingsActivity.class);
                startActivity(i);
                break;
            case R.id.nav_customers:
                fragment = new Customer();
                break;
            case R.id.nav_suppliers:
                fragment = new Suppliers();
                break;
            case R.id.nav_cat:
                fragment = new Categories();
                break;
        }

        //replacing the fragment
        if (fragment != null) {
            FragmentManager manager = getSupportFragmentManager();
            FragmentTransaction transaction = manager.beginTransaction();
            transaction.replace(R.id.content_frame, fragment);
            transaction.commit();
        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
    }
}

在您每次移动到一个位置时,它都会在您的适配器中重新创建片段。 检查上面的示例代码:

初始化您的视图寻呼机:

        viewPager = (ViewPager) findViewById(R.id.viewpager);
    setupViewPager(viewPager);

在 setupViewPager 添加一个片段实例:

    private void setupViewPager(ViewPager viewPager) {
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
    adapter.addFrag(new OneFragment(), "ONE");
    adapter.addFrag(new TwoFragment(), "TWO");
    adapter.addFrag(new ThreeFragment(), "THREE");
    viewPager.setAdapter(adapter);
}

然后在您的片段中,当您移动到该位置时,只需像上面的示例适配器一样从数组中获取存储的片段。

    class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    public ViewPagerAdapter(FragmentManager manager) {
        super(manager);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }

    public void addFrag(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }
}

更新

当您创建每个片段时,您必须为每个片段添加一个唯一的 ID,以便能够检查它是否已经存在。 检查下面的例子:

 FragmentManager fManager = getFragmentManager();
 FragmentTransaction fTransaction = fManager.beginTransaction();
 Fragment fragment = fManager.findFragmentByTag("uniqueTag");
 if (fragment == null) {
     fTransaction.add(R.id.fragment_list, new ListFrag(), "uniqueTag");
     else { // re-use the old fragment
     fTransaction.replace(R.id.fragment_list, fragment, "uniqueTag");

对于遇到此问题的任何人,请执行以下操作:使用getChildFragmentManager()而不是getSupportFragmentManager()

ViewPagerAdapter adapter = new ViewPagerAdapter(getChildFragmentManager());

希望这有帮助

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM