2017-09-27 117 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