findFragmentById возвращает ноль после реализации ViewPager - PullRequest
0 голосов
/ 26 февраля 2020

Я следовал этому руководству для реализации ViewPager (без создания табуляции): https://www.javacodegeeks.com/2013/04/android-tutorial-using-the-viewpager.html

Это работает, но у меня проблема:

Когда я пытаюсь чтобы сделать findFragmentById(R.id.my_fragment), он возвращает мне ноль. И я думаю, это потому, что в моем activity_main.xml нет ничего, кроме ViewPager

Я попытался добавить <fragment> в мой activity_main.xml, теперь я могу получить доступ к своему фрагменту, используя findFragmentById(R.id.my_fragment) но мой ViewPager сейчас не работает

Есть ли способ получить доступ к моему фрагменту? Мне нужно получить доступ к его представлениям.

Вот мой код деятельности. 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`

Вот мой MainActivity onCreate


public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView((int) R.layout.activity_main);
        scan_fragment = (ScanFragment) getSupportFragmentManager().findFragmentById(R.id.scan_fragment);
        nfcButton = (ImageButton) findViewById(R.id.nfc_button);
        integrator = new IntentIntegrator(this);
        pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this, getClass()).addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP), 0);
        //
        anim = ObjectAnimator.ofFloat(this.nfcButton, "scaleX", new float[]{0.9f});
        anim2 = ObjectAnimator.ofFloat(this.nfcButton, "scaleY", new float[]{0.9f});
        List<Fragment> fragments = getFragments();
        pageAdapter = new MyPageAdapter(getSupportFragmentManager(), fragments);
        ViewPager pager = (ViewPager) findViewById(R.id.viewpager);
        pager.setAdapter(pageAdapter);
    }

    private List<Fragment> getFragments() {
        List<Fragment> fList = new ArrayList<Fragment>();
        fList.add(ScanFragment.newInstance("Fragment 1"));
        fList.add(WebFragment.newInstance("Fragment 2"));
        return fList;
    }

MyPageAdapter


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

А мой фрагмент XML просто содержит несколько кнопок и изображений

Ответы [ 2 ]

0 голосов
/ 27 февраля 2020

Извините, что разочаровываю вас, но этот учебник, который вы читаете, сломан, и вы не должны им следовать.

.

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);
0 голосов
/ 26 февраля 2020

Возможно, ошибка возникает из-за того, что ViewPager не поддерживает все активные фрагменты, только текущий и два других рядом с ним в onPause (). Другие не имеют представлений, созданных для Activity, но мы можем получить к ним доступ через 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;
        }

    }
...