Почему мой код возвращает нулевой указатель для существующего фрагмента? - PullRequest
0 голосов
/ 08 июня 2018

У меня есть набор вкладок в Android Studio.Все они работают нормально, но ни один из них не показывает никакого контента, хотя у них есть контент.Поэтому я немного покопался на этом сайте и обнаружил Проблемы, с которыми пользователи сталкиваются с фрагментами

Так что я последовал совету, который дал пользователь.Но похоже, что мое приложение вылетает из-за исключения нулевого указателя.Кто-нибудь может помочь мне определить ошибку, пожалуйста:
MainActivity.java

public class MainActivity extends AppCompatActivity implements Photos.OnFragmentInteractionListener, About.OnFragmentInteractionListener, Watch.OnFragmentInteractionListener{
    private TabLayout myTabLayOut;
    private  ViewPager viewPager;
    private  TabsPagerAdapter tabsPagerAdapter;
    public MainActivity()
    {

    }
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_content);

        myTabLayOut = findViewById(R.id.tabLayout);
        myTabLayOut.addTab(myTabLayOut.newTab().setText("Photos"));
        myTabLayOut.addTab(myTabLayOut.newTab().setText("About"));
        myTabLayOut.addTab(myTabLayOut.newTab().setText("Watch"));
        myTabLayOut.setTabGravity(TabLayout.GRAVITY_FILL);


        myTabLayOut.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                viewPager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

        viewPager = findViewById(R.id.pager);
        //Item 0 being the photos fragment. Just for testing for the time being. WHERE The error happens
        tabsPagerAdapter = new TabsPagerAdapter(tabsPagerAdapter.getItem(0).getTargetFragment(), myTabLayOut.getTabCount());
        viewPager.setAdapter(tabsPagerAdapter);
        viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(myTabLayOut));
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.my_menu,menu);
        return true;
    }

    @Override
    public void onFragmentInteraction(Uri uri) {

    }
}

TabsPagerAdapter.java

public class TabsPagerAdapter extends FragmentPagerAdapter {
    //A field to hold the number of tabs
    private int numberOfTabs;
    public TabsPagerAdapter(Fragment fragmentManager, int numberOfTabs)
    {

        super(fragmentManager.getChildFragmentManager());
        this.numberOfTabs = numberOfTabs;
    }
    //Which item to return depending on the position
    @Override
    public Fragment getItem(int position) {
        switch (position)
        {
            case 0:
                return new Photos();
            case 1:
                return new About();
            case 2:
                return new Watch();
                default:
                    return null;
        }
    }

    @Override
    public int getCount() {
        return numberOfTabs;
    }
}

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

FragmentViewPagers getItem имя метода вводит в заблуждение - оно не возвращает фактический фрагмент, представленный в пейджере, оно используется только для их создания один раз.Если вы попытаетесь вызвать этот метод, вы всегда получите новый предмет.

0 голосов
/ 08 июня 2018

Ваша проблема с этой строкой:

tabsPagerAdapter = new TabsPagerAdapter(tabsPagerAdapter.getItem(0)...

При попытке присвоить значение tabsPagerAdapter, вы пытаетесь использовать значение из этого объекта, которое в то время NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...