簡體   English   中英

滑動到新片段並在tabLayout中滑動回到上一個片段時,應用程序崩潰

[英]app crashes when swipe to new fragment and swipe back to previous fragment in tabLayout

我有一個Main片段,其中包含兩個片段(片段A和B),並且在工具欄中的上方有一個用於搜索目的的搜索圖標。 我的問題是,當我只在片段A和片段B之間滑動並使用搜索圖標進行一些搜索過濾時,該應用程序運行正常。 但是問題是,當我在主片段中添加另一個新片段C時,啟動應用程序並滑動到片段C,然后滑動回到片段A或B,然后單擊搜索圖標,應用程序崩潰了。

這是崩潰日志

2019-03-07 22:52:10.616 28866-28866 / com.example.welsenho.questfy_tw E / AndroidRuntime:致命例外:主進程:com.example.welsenho.questfy_tw,PID:28866 java.lang.ClassCastException:com。 example.welsenho.questfy_tw.MainActivityFragment.MostPopularFragment無法在com.example.com.example.welsenho.questfy_tw.MainUserActivity.MainActivity.searchFilter(MainActivity.java:303)上轉換為com.example.welsenho.questfy_tw.MainActivityFragment.MainActivityLatestArticleFragment welsenho.questfy_tw.MainUserActivity.MainActivity.access $ 200(MainActivity.java:50)位於com.example.welsenho.questfy_tw.MainUserActivity.MainActivity $ 1.onQueryTextChange(MainActivity.java:158)位於android.support.v7.widget.SearchView。 onTextChanged(SearchView.java:1181)(位於android.support.v7.widget.SearchView)$ 10.onTextChanged(SearchView.java:1715)位於android.widget.TextView.sendOnTextChanged(TextView.java:9364)(位於android.widget.TextView)。在android.widget.TextView.setText(TextView.java :)中的setText(TextView.java:5397): 5250)位於android.widget.EditText.setText(EditText.java:113),位於android.widget.TextView.setText(TextView.java:5207),位於android.support.v7.widget.SearchView.onActionViewExpanded(SearchView.java:1295) ),位於android.support.v7.widget.Toolbar $ ExpandedActionViewMenuPresenter.expandItemActionView(Toolbar.java:2397)

它說片段A不能轉換為片段B,但是我不明白的是,如果我不滑動到片段C(僅在片段A和片段B之間),一切都會好起來,但是在滑動到片段C並滑動之后返回片段A或B,然后單擊搜索圖標,則應用程序將崩潰

主要活動的代碼

private void searchFilter(String inputText, ArrayList<FirebaseDatabaseGetSet> decidedFilterList) {
    Log.d("TAG", "searchFilter");
    ArrayList<FirebaseDatabaseGetSet> filterList = new ArrayList<>();
    if (!filterList.isEmpty()) {
        filterList.clear();
    }

    MainActivityLatestArticleFragment latestArticleFragment;
    MostPopularFragment mostPopularFragment;
    MainSubjectChooseFragment mainSubjectChooseFragment;

    //MainSubjectChooseFragment mainSubjectChooseFragment(Fragment C) = (MainSubjectChooseFragment) getSupportFragmentManager().getFragments().get(0).getChildFragmentManager() .getFragments().get(2);
    latestArticleFragment(Fragment A) = (MainActivityLatestArticleFragment) getSupportFragmentManager().getFragments().get(0).getChildFragmentManager().getFragments().get(0);
    mostPopularFragment(Fragment B) = (MostPopularFragment) getSupportFragmentManager().getFragments().get(0).getChildFragmentManager().getFragments().get(1);

    Log.d("TAG", "Fragment");

    for (FirebaseDatabaseGetSet firebaseDatabaseGetSet : decidedFilterList) {
        if (firebaseDatabaseGetSet.getTitle().toLowerCase().contains(inputText.toLowerCase())) {
            filterList.add(firebaseDatabaseGetSet);
            if (currentFilterPage == 0) {
                Log.d("TAG", "Fragment0");
                if (latestArticleFragment != null) {
                    Log.d("TAG", "notNull");
                    if (!filterList.isEmpty()) {
                        Log.d("TAG", "filter");
                        latestArticleFragment.returnFilterList(filterList);
                    }
                }
            } else if (currentFilterPage == 1) {
                Log.d("TAG", "Fragment1");
                if (mostPopularFragment != null) {
                    if (!filterList.isEmpty()) {
                        mostPopularFragment.returnFilterList(filterList);
                    }
                }
            }
        }
    }

}

主片段代碼

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_main_activity_tab, container, false);
    tabLayout = view.findViewById(R.id.main_activity_tabLayout);
    viewPager = view.findViewById(R.id.main_activity_viewpager);
    viewPager.setAdapter(new MainActivityTabAdapter(getChildFragmentManager(), Locale.getDefault().getDisplayLanguage()));
    tabLayout.post(new Runnable() {
        @Override
        public void run() {
            tabLayout.setupWithViewPager(viewPager);
        }
    });

    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int i, float v, int i1) {
            mListener.getTabCurrentPage(i);
        }

        @Override
        public void onPageSelected(int i) {
            mListener.getTabCurrentPage(i);
        }

        @Override
        public void onPageScrollStateChanged(int i) {

        }
    });
    return view;

適配器的代碼

@Override
public Fragment getItem(int i) {
    switch (i){
        case 0: return new MainActivityLatestArticleFragment();
        case 1: return new MostPopularFragment();
        case 2: return new MainSubjectChooseFragment();
    }
    return null;
}

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

@Nullable
@Override
public CharSequence getPageTitle(int position) {
    if (language.equals("中文")) {
        switch (position) {
            case 0:
                return "最新文章";
            case 1:
                return "熱門文章";
            case 2:
                return "相關科系";
        }
    }else {
        switch (position) {
            case 0:
                return "Latest Article";
            case 1:
                return "Most Popular";
            case 2:
                return "Program Select";
        }
    }
    return null;
}

片段A和B中的代碼僅用於從Firebase檢索數據並將其加載到recyclerView中。 它說問題是由以下行引起的LatestArticleFragment(Fragment A)=(MainActivityLatestArticleFragment)getSupportFragmentManager()。getFragments()。get(0).getChildFragmentManager()。getFragments()。get(0); 部分,但我不明白的是,當我不嘗試滑動到片段C時,一切都可以順利進行,但是如果我滑動到片段C並滑動回到片段A和B,則單擊搜索圖標,應用程序將墜毀。 我已經被這個問題困擾了3天,並嘗試了一些解決方案,但它根本無法工作。 誰能解釋為什么我遇到這個問題以及如何解決?

我的直覺是,如果將屏幕頁面限制設置為大於1,則不會遇到此問題。 因此,在您的MainFragment的onCreateView添加以下一行:

viewPager = view.findViewById(R.id.main_activity_viewpager);
// add below line
viewpager.setOffscreenPageLimit(2)
viewPager.setAdapter(new MainActivityTabAdapter(getChildFragmentManager(), Locale.getDefault().getDisplayLanguage()));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM