Java findFragmentById在实现ViewPager后返回null

Java findFragmentById在实现ViewPager后返回null,java,android,android-fragments,android-viewpager,Java,Android,Android Fragments,Android Viewpager,我按照本教程实现了ViewPager(无需创建表格布局): 它可以工作,但我有一个问题: 当我尝试执行findFragmentById(R.id.my_fragment)时,它返回null。我想这是因为在我的activity\u main.xml中除了ViewPager没有别的东西 我试图在我的活动\ u main.xml中添加,现在我可以使用findFragmentById(R.id.my\ u fragment)访问我的片段,但我的ViewPager现在无法工作 有办法进入我的片段吗?我需要

我按照本教程实现了ViewPager(无需创建表格布局):

它可以工作,但我有一个问题:

当我尝试执行
findFragmentById(R.id.my_fragment)
时,它返回null。我想这是因为在我的
activity\u main.xml
中除了ViewPager没有别的东西

我试图在我的
活动\ u main.xml
中添加
,现在我可以使用
findFragmentById(R.id.my\ u fragment)
访问我的片段,但我的ViewPager现在无法工作

有办法进入我的片段吗?我需要了解他的观点

以下是我的活动_main.xml:


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <androidx.viewpager.widget.ViewPager
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>`enter code here`


而且我的片段的XML只包含很少的按钮和图像

可能出现错误是因为ViewPager没有将所有片段保持活动状态,只有当前片段和onPause()中位于其一侧的另外两个片段。其他人没有为活动创建的视图,但我们可以通过ViewPager访问它们,因为片段的实例已经保存

我希望以下代码可以帮助您:

/******************************************/
    //Your ADAPTER.
    class MyPageAdapter extends FragmentPagerAdapter {

        private List<Fragment> fragments;

        //Your code...


        /**
         * Use this method for get the fragments list.
         */
        public List<Fragment> getFragments(){
            return fragments;
        }

    }


    /******************************************/
    //In your ACTIVITY.
    private List<Fragment> getFragments() {
        pageAdapter.getFragments();
    }

    /**
    * Use this to find a view and cast for your needs.
    */
    private View findById(int fragmentIndex, int viewId){
        Fragment fragment = this.getFragments().get(fragmentIndex);
        View view = ((YourFragment) fragment).getView(); //Casting to YourFragment and catching root view.
        return view.findViewById(viewId);
    }



    /******************************************/
    //In your FRAGMENTS.
    //Must save fragment rootView to access to findById() method. For example:
    public class YourFragment extends Fragment{

        private View view;

        @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
                view = inflater.inflate(R.layout.fragment_scan, container, false);
                //Your code....
                return view;
        }

        public View getView(){
            return view;
        }

    }
/******************************************/
//你的适配器。
类MyPageAdapter扩展了FragmentPagerAdapter{
私有列表片段;
//你的代码。。。
/**
*使用此方法获取片段列表。
*/
公共列表getFragments(){
返回碎片;
}
}
/******************************************/
//在你的活动中。
私有列表getFragments(){
pageAdapter.getFragments();
}
/**
*使用此选项可以根据您的需要查找视图和强制转换。
*/
私有视图findById(int fragmentIndex,int viewId){
Fragment Fragment=this.getFragments().get(fragmentIndex);
视图视图=((YourFragment)fragment.getView();//转换到YourFragment并捕获根视图。
返回view.findViewById(viewId);
}
/******************************************/
//在你的碎片里。
//必须保存片段rootView才能访问findById()方法。例如:
公共类YourFragment扩展了片段{
私人视野;
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\U扫描,容器,错误);
//你的代码。。。。
返回视图;
}
公共视图getView(){
返回视图;
}
}

很抱歉让您失望,但您正在学习的教程已经中断,您不应该学习

  • 见第3页

  • 遵循这个要点

  • 并参考


请发布您的xml和片段/活动代码是的,我已经编辑了我的帖子:)您可以直接使用view_pager当前项目,而不是通过idhow查找?例如,从我的MainActivity,我想访问一个文本(例如),我在片段中使用的文本如下:
scan\u Fragment=(ScanFragment)getSupportFragmentManager().findFragmentById(R.id.scan\u Fragment)然后:
scan.fragment.my_text='foo'我尝试了这个
列表frags=getFragments();scan_fragment=(ScanFragment)frags.get(0)但它仍然不起作用谢谢你的帮助,但在我的情况下,我只有一个活动,实际上在我的活动中只使用了一个片段任何适配器中的任何
列表
都只会导致潜在的崩溃。

class MyPageAdapter extends FragmentPagerAdapter {

    private List<Fragment> fragments;

    public MyPageAdapter(FragmentManager fm, List<Fragment> fragments) {
        super(fm);
        this.fragments = fragments;
    }

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


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

    public interface OnButtonClickedListener {
        public void onButtonClicked(View view);
    }

    public static final ScanFragment newInstance(String message)
    {
        ScanFragment f = new ScanFragment();
        Bundle bdl = new Bundle(1);
        bdl.putString(EXTRA_MESSAGE, message);
        f.setArguments(bdl);
        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_scan, container, false);
        mainActivity = (MainActivity) getActivity();
        MainActivity.display = 0;
        qrButton = (ImageButton) view.findViewById(R.id.main_button);
        nfcButton = (ImageButton) view.findViewById(R.id.nfc_button);
        anim = ObjectAnimator.ofFloat(this.nfcButton, "scaleX", new float[]{0.9f});
        anim2 = ObjectAnimator.ofFloat(this.nfcButton, "scaleY", new float[]{0.9f});
        nfcButton.setOnClickListener(this);
        qrButton.setOnClickListener(this);
        return view;
    }

/******************************************/
    //Your ADAPTER.
    class MyPageAdapter extends FragmentPagerAdapter {

        private List<Fragment> fragments;

        //Your code...


        /**
         * Use this method for get the fragments list.
         */
        public List<Fragment> getFragments(){
            return fragments;
        }

    }


    /******************************************/
    //In your ACTIVITY.
    private List<Fragment> getFragments() {
        pageAdapter.getFragments();
    }

    /**
    * Use this to find a view and cast for your needs.
    */
    private View findById(int fragmentIndex, int viewId){
        Fragment fragment = this.getFragments().get(fragmentIndex);
        View view = ((YourFragment) fragment).getView(); //Casting to YourFragment and catching root view.
        return view.findViewById(viewId);
    }



    /******************************************/
    //In your FRAGMENTS.
    //Must save fragment rootView to access to findById() method. For example:
    public class YourFragment extends Fragment{

        private View view;

        @Override
            public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                     Bundle savedInstanceState) {
                view = inflater.inflate(R.layout.fragment_scan, container, false);
                //Your code....
                return view;
        }

        public View getView(){
            return view;
        }

    }
class MyFragmentPagerAdapter(
    private val context: Context,
    fragmentManager: FragmentManager
) : FragmentPagerAdapter(fragmentManager) {
    override fun getCount() = 2

    override fun getItem(position: Int) = when(position) {
        0 -> FirstFragment()
        1 -> SecondFragment()
        else -> throw IllegalStateException("Unexpected position $position")
    }

    override fun getPageTitle(position: Int): CharSequence = when(position) {
        0 -> context.getString(R.string.first)
        1 -> context.getString(R.string.second)
        else -> throw IllegalStateException("Unexpected position $position")
    }
}

class ParentFragment: Fragment() {
    override fun onCreateView(...) = ...

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        viewPager.adapter = MyFragmentPagerAdapter(requireContext(), childFragmentManager)
        tabLayout.setupWithViewPager(viewPager)
    }
}
Fragment fragment = childFragmentManager.findFragmentByTag("android:switcher:" + viewPager.getId() + ":" + fragmentPosition);