简体   繁体   English

将Viewpager片段的状态保存在导航抽屉片段中

[英]Save state of viewpager fragment in navigation drawer fragments

I have Navigation drawer.and in First fragmant of Navigation drawer there is viewpager and there is information coming from network.Viewpager has 2 fragments also.When I switch fragment to Settings fragment of navigation drawer and coming back to this fragment everything is gone..There is no any information..How can i save state of this fragment?Or in which method can i send request to take information from network again 我有导航抽屉。在导航抽屉的第一个部件中有viewpager,并且有来自网络的信息.Viewpager也有2个片段。当我将片段切换到导航抽屉的Settings片段并回到该片段时,一切都消失了。没有任何信息..如何保存此片段的状态?或者我可以通过哪种方法再次发送请求以从网络获取信息

MainActivity 主要活动

          public class MainActivity extends AppCompatActivity implements 

        NavigationView.OnNavigationItemSelectedListener {

        private DrawerLayout drawer;

@Override

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    drawer = (DrawerLayout) findViewById(R.id.drawer_layout);


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

    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.motherFragments, FragmentMainPage.newInstance("MainPage"))
            .commit();
}

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

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home: {
            drawer.openDrawer(GravityCompat.START);
            break;
        }

    }

    return super.onOptionsItemSelected(item);
}

@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
    Fragment fragment = null;

    if (item.isChecked()) {
        drawer.closeDrawer(GravityCompat.START);
        return false;
    }
    switch (item.getItemId()) {

        case R.id.home: {
            fragment = new FragmentMainPage().newInstance("Sample");
            break;
        }
        case R.id.settings:{
            Intent intent = new Intent(this,SettingsActivity.class);
            startActivity(intent);
            break;
        }
        case R.id.incoming:{
            fragment  = new FragmentIncomingPage().newInstance("Sample");
            break;
        }

    }

    if (fragment != null) {
        getSupportFragmentManager()
                .beginTransaction().replace(R.id.motherFragments, fragment)
                .commit();
        item.setChecked(true);

    }

    drawer.closeDrawer(GravityCompat.START);
    return true;
} }

Fragment1 of Navigation drawer 导航抽屉的Fragment1

            public class FragmentMainPage extends Fragment implements 
         ViewPager.OnPageChangeListener {
             private Toolbar toolbar;
              private MainActivity activity;
           private TabLayout tabLayout;
             private ViewPager viewPager;

String[] names = {
        "Sample 1",
        "Sample 2"

};



private static FragmentMainPage myInstance;
public static FragmentMainPage newInstance(String testString){
    Bundle bundle = new Bundle();
    bundle.putString("test",testString);
    if(myInstance == null){
        myInstance = new FragmentMainPage();
    }
    myInstance.setArguments(bundle);
    return myInstance;
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    activity = ((MainActivity) context);
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_fragment_main,container,false);
    toolbar = (Toolbar) view.findViewById(R.id.toolbar);

    activity.setSupportActionBar(toolbar);
    activity.setTitle(getResources().getText(R.string.bosh_sahifa));
    activity.getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu_white_24dp);
    activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    viewPager = (ViewPager) view.findViewById(R.id.viewpager);
    setupViewpager(viewPager);
    tabLayout = (TabLayout) view.findViewById(R.id.tabs);
    tabLayout.setupWithViewPager(viewPager);
    viewPager.addOnPageChangeListener(this);
    setupTabName();

    return view;
}


private void setupViewpager(ViewPager viewPager) {
    MyAdapter adapter = new MyAdapter(getActivity().getSupportFragmentManager());
    adapter.addFragement(new Fragment_home1());
    adapter.addFragement(new Fragment_home2());

    viewPager.setAdapter(adapter);

}

private void setupTabName() {
    tabLayout.getTabAt(0).setText(names[0]);
    tabLayout.getTabAt(1).setText(names[1]);

}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);


}

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

}

@Override
public void onPageSelected(int position) {

}

@Override
public void onPageScrollStateChanged(int state) {

}

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

    public MyAdapter(FragmentManager fm) {
        super(fm);
    }

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

    @Override
    public int getCount() {
        return mFragmentList.size();
    }
    public void addFragement(Fragment fragment){
        mFragmentList.add(fragment);
    }
}

} }

Fragment 2 of Navigation drawer 导航抽屉的片段2

             public class FragmentIncomingPage extends Fragment  {
             private Toolbar toolbar;
               private MainActivity activity;




private static FragmentIncomingPage myInstance;
public static FragmentIncomingPage newInstance(String testString){
    Bundle bundle = new Bundle();
    bundle.putString("test",testString);
    if(myInstance == null){
        myInstance = new FragmentIncomingPage();
    }
    myInstance.setArguments(bundle);
    return myInstance;
}

@Override
public void onAttach(Context context) {
    super.onAttach(context);
    activity = ((MainActivity) context);
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.activity_fragment_incoming,container,false);
    toolbar = (Toolbar) view.findViewById(R.id.toolbar);

    activity.setSupportActionBar(toolbar);
    activity.setTitle(getResources().getText(R.string.Incoming));
    activity.getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_menu_white_24dp);
    activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    return view;
}

} }

You can use fragment.addToBackStack(null) method. 您可以使用fragment.addToBackStack(null)方法。 like, 喜欢,

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.content_frame, A);
ft.addToBackStack(null);
ft.commit();

There is few ways to achieve it. 实现它的方法很少。

  1. You can use SharedPreferences to save current Fragment by mViewPager.getCurrentItem() and set it again once you come to the ViewPager activity by navigation drawer button. 您可以使用SharedPreferences通过mViewPager.getCurrentItem()保存当前的Fragment,并在通过导航抽屉按钮进入ViewPager活动后再次进行设置。

  2. Use BaseFragment and implement your fragments from the Base Fragment, keep current visible fragment of the view pager in side the Base Fragment as protected variable. 使用BaseFragment并从Base Fragment中实现您的片段,将View分页器的当前可见片段保留在Base Fragment旁边作为受保护的变量。

  3. As Base Fragment which is describe above, You can use Bas Activity class. 作为上述基础片段,您可以使用Bas Activity类。

有3个片段并滑动到第3个片段然后返回第1个片段,第1个片段的数据不见了?

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

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