2017-09-27 95 views
1

我的应用程序中有一个问题,我在我的活动中加载了一个片段,在片段中我使用了ViewPager(用于TabLayout),所以我想处理ViewPager的BackPressed。 因为没有OnKeyDown override method在片段中可用,所以我想在我的父活动中引用我的片段ViewPager,所以我可以在onBackPressed() method活动中处理这种情况。在父活动中访问片段viewPager

活动代码:

fragment= new TabFragment(); 
if (fragment != null) { 
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); 
     ft.replace(R.id.containerView, fragment); 
     ft.commitAllowingStateLoss(); 
     // ft.commit(); 
    } 
@Override 
public void onBackPressed() { 

if (isMainShown) { 
    // want the refrence of view pager so i can handle ViewPager on backPress 

    } 
else { 

    //display tab fragment 
} 
    //super.onBackPressed(); 
} 

TabFragment:

public class TabFragment extends Fragment { 


public TabFragment() { 
    // Required empty public constructor 
} 
public static TabLayout tabLayout; 
public static ViewPager viewPager; 
public static int int_items = 2 ; View x; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    x=inflater.inflate(R.layout.content_main_menu,null); 
    tabLayout=(TabLayout) x.findViewById(R.id.tabs); 
    viewPager =(ViewPager) x.findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 
    //viewPager.setAdapter(new MyAdapter(getChildFragmentManager())); 
    viewPager.setOffscreenPageLimit(1); 
    tabLayout.post(new Runnable() { 
     @Override 
     public void run() { 
      tabLayout.setupWithViewPager(viewPager); 
     } 
    }); 
return x; 
} 

@RequiresApi(api = Build.VERSION_CODES.KITKAT) 
@Override 
public void onDetach() { 
    super.onDetach(); 

    try { 
     Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager"); 
     childFragmentManager.setAccessible(true); 
     childFragmentManager.set(this, null); 

    } catch (NoSuchFieldException | IllegalAccessException e) { 
     throw new RuntimeException(e); 
    } 
} 



private void setupViewPager(ViewPager viewPager) { 
    MyAdapter adapter = new MyAdapter(getChildFragmentManager()); 
    adapter.addFragment(new TabOne(), "TAb1"); 
    adapter.addFragment(new TabTwo(), "Tab2"); 

    viewPager.setAdapter(adapter); 

    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
     @Override 
     public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 
      final InputMethodManager imm = (InputMethodManager)getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.hideSoftInputFromWindow(x.getWindowToken(), 0); 
     } 

     @Override 
     public void onPageSelected(int position) { 

     } 

     @Override 
     public void onPageScrollStateChanged(int state) { 

     } 
    }); 
} 


private class MyAdapter extends FragmentPagerAdapter{ 
    private final List<Fragment> mFragmentList = new ArrayList<>(); 
    private final List<String> mFragmentTitleList = 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(); 
    } 
    void addFragment(Fragment fragment, String title) { 
     mFragmentList.add(fragment); 
     mFragmentTitleList.add(title); 
    } 

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


    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     return super.instantiateItem(container, position); 
    } 
} 


}...... 
+0

尝试'((MainActivity)getActivity())onBackPressed()' –

+0

即时消息没有得到..这里我把上面的行..请解释一下多一点 – techDigi

+0

尝试使用[这](HTTPS: //github.com/ikidou/FragmentBackHandler)在你的代码 – KeLiuyue

回答

1

onBackPressed()

fragobjTab = (TabFragment) getSupportFragmentManager().findFragmentById(R.id.containerView); 
     try { 
      fragobjTab.onBackPressed(); 

     }catch (Exception e){ 
      e.printStackTrace(); 
     } 

添加该代码,并创建一个在您tabFragment和setCurrentItem到ViewPager一个onBackPressed方法:

public void onBackPressed() 
{ 
    // set page to your viewPager 
    // 0 is your first viewpager fragment 
    viewPager.setCurrentItem(0,true); 
} 
+0

我会检查它 – techDigi

+0

谢谢...它的作品就像一个魅力... – techDigi