android - 在父 Activity 中访问 fragment viewPager

标签 android android-fragments android-viewpager

我的应用程序有问题,我在 Activity 中加载了一个 fragment ,在 fragment 中我使用了 ViewPager(用于 TabLayout),所以我想处理 ViewPager 的 BackPressed。 因为 fragment 中没有可用的 OnKeyDown 覆盖方法 所以我想在我的父 Activty 中引用我的 Fragment ViewPager 以便我可以在 onBackPressed() 方法 Activity 中处理这种情况.

Activity 代码:

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();
}

标签 fragment :

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);
    }
}


}......

最佳答案

将此代码添加到您的 onBackPressed()

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

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

然后在您的 tabFragment 中创建一个 onBackPressed 方法,并将 setCurrentItem 设置到 ViewPager:

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

关于android - 在父 Activity 中访问 fragment viewPager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46441721/

相关文章:

安卓事物 : 5. 1

javascript - Cordova Android - 禁用定位服务时,getCurrentPosition 不会触发错误回调

android - 我在 R.java 中有错误?

Android ViewPager2,上一项和下一项变暗处理

java - 改造 URL 中的端点

java - Android 在保持宽高比的同时显示图像

android - 如何刷新 TableLayout 中的数据?

android - 当 Fragment 显示时可以看到它后面的宿主 Activity(好像是透明的)

android - 在操作栏选项卡内滑动选项卡

android - 嵌套viewpager的setCurrentItem