导航抽屉背压片段无法加载

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了导航抽屉背压片段无法加载相关的知识,希望对你有一定的参考价值。

我有一个navigation drawer with fragments。一开始,我将Home fragment显示为默认值。

导航菜单上有选项。在2片段我有SwipeRefreshLayout。在获取所有recyclerview数据之前,我显示数据和不可见的SwipeRefreshLayout

其中一个片段(包括SwipeRefReshLayout)工作正常,但在Home片段中有些东西是错误的。

例如(用例)

你启动了app,你看到了Home片段

您单击导航菜单上的配置文件片段

你运行onBackPressed(后退按钮)。

在这种情况下,数据永远不会加载,SwipeRefReshLayout始终在旋转。 (我也尝试过没有refreshlayout,仍然相同)

知道如何解决这个问题吗?我的想法是,它关于显示默认片段。

导航抽屉活动

public class Page_Navigation extends AppCompatActivity
    implements NavigationView.OnNavigationItemSelectedListener {

    Fragment fragment;
    FragmentManager fragmentManager = getSupportFragmentManager();
    NavigationView navigationView;

    SharedPreferences mSharedPref;
    DrawerLayout drawer;
    private Tracker mTracker;
    FragmentTransaction fragmentTransaction;

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

        //
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        TextView toolbar_head = findViewById(R.id.toolbar_head);
        ImageView toolbar_image = findViewById(R.id.toolbar_image);
        ImageView toolbar_profile = findViewById(R.id.toolbar_profile);
        drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        //

        AnalyticsApplication application = (AnalyticsApplication) getApplication();
        mTracker = application.getDefaultTracker();
        mTracker.setScreenName("page_navigation");
        mTracker.send(new HitBuilders.ScreenViewBuilder().build());


        //FIRST SETTINGS
        setSupportActionBar(toolbar);
        Typeface customFont = Typeface.createFromAsset(getAssets(), "Montserrat-Medium.ttf");
        toolbar_head.setTypeface(customFont);

        //Get Sessions
        mSharedPref = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
        String session_user_name = mSharedPref.getString("session_user_name", "");
        String session_user_photo = mSharedPref.getString("session_user_photo", "");

        //Navigation Drawer
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();

        navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
        navigationView.setItemIconTintList(null);
        //

        View headerView = navigationView.getHeaderView(0);
        TextView nav_userName = (TextView) headerView.findViewById(R.id.textView_nav_userName);
        CircleImageView imageView_navigation = (CircleImageView) headerView.findViewById(R.id.imageView_navigation);
        Glide.with(getApplicationContext()).load(session_user_photo).into(imageView_navigation);
        nav_userName.setText(session_user_name);

        headerView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (drawer.isDrawerOpen(Gravity.START)) {
                    drawer.closeDrawer(Gravity.START);
                }

                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        showProfileFragment();
                    }
                }, 300);
            }
        });


        toolbar_image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                drawer.openDrawer(GravityCompat.START);
            }
        });

        toolbar_profile.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Fragment fragment;
                FragmentManager manager = getSupportFragmentManager();
                fragment = new Nav_Profile();
                fragmentTransaction = manager.beginTransaction();
                fragmentTransaction.replace(R.id.navContent, fragment).addToBackStack(null).commit();
            }
        });

        displayDefaultFragment();

    }

    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.page__navigation, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in androidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }


        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.

        final int id = item.getItemId();


        drawer.closeDrawer(GravityCompat.START);

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                switch (id) {
                    case R.id.nav_home:
                        fragment = new Nav_Home();
                        break;

                    case R.id.nav_contact:
                        fragment = new Nav_Contact();
                        break;

                    case R.id.nav_articles:
                        fragment = new Nav_Article();
                        break;

                    case R.id.nav_about:
                        fragment = new Nav_AboutUs();
                        break;

                    case R.id.nav_suggest:
                        fragment = new Nav_Suggest();
                        break;

                    case R.id.nav_share:
                        fragment = new Nav_Share();
                        break;

                    case R.id.nav_rateApp:
                        fragment = new Nav_RateApp();
                        break;


                }

                fragmentManager.beginTransaction()
                        .replace(R.id.navContent, fragment)
                        .addToBackStack(null)
                        .commit();

            }
        }, 350);


        return true;
    }

    public void displayDefaultFragment() {
        fragment = new Nav_Home();
        fragmentManager.beginTransaction().replace(R.id.navContent, fragment).commit();

    }


    public void showProfileFragment() {
        fragment = new Nav_Profile();
        fragmentManager.beginTransaction().replace(R.id.navContent, fragment).addToBackStack(null).commit();
    }
}

家庭片段

public class Nav_Home extends Fragment implements View.OnClickListener{

    SharedPreferences mSharedPref;

    private SwipeRefreshLayout swipeRefresh_home;

    private CardView item_homeTop_coupons, item_homeTop_draws, item_homeTop_event;
    private LinearLayout layout_all_article, layout_all_999;
    private ScrollView shimmer_home;

    private List<Model_ListItem> listNewItems;
    private RecyclerView recyclerView_item_home;

    private List<Model_Article> articleList;
    private RecyclerView recyclerView_article_home;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        fetchItemsNew();
        fetchArticlesNew();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View view = inflater.inflate(R.layout.fragment_nav__home, container, false);
        item_homeTop_coupons = view.findViewById(R.id.item_homeTop_coupons);
        item_homeTop_draws = view.findViewById(R.id.item_homeTop_draws);
        item_homeTop_event = view.findViewById(R.id.item_homeTop_event);
        recyclerView_item_home = view.findViewById(R.id.recyclerView_item_home);
        recyclerView_article_home = view.findViewById(R.id.recyclerView_article_home);
        layout_all_article = view.findViewById(R.id.layout_all_article);
        layout_all_999 = view.findViewById(R.id.layout_all_999);
        swipeRefresh_home = view.findViewById(R.id.swipeRefresh_home);
        shimmer_home = view.findViewById(R.id.shimmer_home);
        item_homeTop_coupons.setOnClickListener(this);
        item_homeTop_draws.setOnClickListener(this);
        item_homeTop_event.setOnClickListener(this);
        layout_all_999.setOnClickListener(this);
        layout_all_article.setOnClickListener(this);

        //first settngs
        mSharedPref = PreferenceManager.getDefaultSharedPreferences(view.getContext());
        String session_user_email = mSharedPref.getString("session_user_email","");


        swipeRefresh_home.setRefreshing(true);
        return view;
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){

            case R.id.item_homeTop_coupons:
                startActivity(new Intent(getContext(), Page_Coupon.class));
                break;

            case R.id.item_homeTop_draws:
                startActivity(new Intent(getContext(), Page_Draw.class));
                break;

            case R.id.item_homeTop_event:
                startActivity(new Intent(getContext(), Page_Event.class));
                break;

            case R.id.layout_all_999:
                //999 city search activity
                startActivity(new Intent(getContext(), Page_SearchCity.class));
                break;

            case R.id.layout_all_article:
                //article fragment
                Fragment fragment;
                FragmentManager fragmentManager = getFragmentManager();
                fragment = new Nav_Article();
                fragmentManager.beginTransaction().replace(R.id.navContent, fragment).addToBackStack(null).commit();
                break;

        }
    }



    public void fetchItemsNew(){
        listNewItems = new ArrayList<>();
        API_Service api_service = Client.getRetrofitInstance().create(API_Service.class);
        Call<List<Model_ListItem>> call = api_service.fetchItemsNew();
        call.enqueue(new Callback<List<Model_ListItem>>() {
            @Override
            public void onResponse(Call<List<Model_ListItem>> call, Response<List<Model_ListItem>> response) {

                if(response.code() == 200){

                    listNewItems = response.body();
                    Adapter_HomeItem adapter_homeItem = new Adapter_HomeItem(getContext(), listNewItems);
                    LinearLayoutManager layoutManager
                            = new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false);
                    recyclerView_item_home.setHasFixedSize(true);
                    recyclerView_item_home.setLayoutManager(layoutManager);
                    recyclerView_item_home.setAdapter(adapter_homeItem);

                    SnapHelper helper = new LinearSnapHelper();
                    helper.attachToRecyclerView(recyclerView_item_home);

                }

            }

            @Override
            public void onFailure(Call<List<Model_ListItem>> call, Throwable t) {

            }
        });

    }

    public void fetchArticlesNew(){
        articleList = new ArrayList<>();
        API_Service api_service = Client.getRetrofitInstance().create(API_Service.class);
        Call<List<Model_Article>> callArticle = api_service.fetchArticlesNew();
        callArticle.enqueue(new Callback<List<Model_Article>>() {
            @Override
            public void onResponse(Call<List<Model_Article>> call, Response<List<Model_Article>> response) {

                if(response.code() == 200){

                    articleList = response.body();
                    Adapter_HomeArticles adapter_homeArticles = new Adapter_HomeArticles(getContext(), articleList);
                    LinearLayoutManager layoutManager
                            = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
                    recyclerView_article_home.setLayoutManager(layoutManager);
                    recyclerView_article_home.setHasFixedSize(true);
                    recyclerView_article_home.setAdapter(adapter_homeArticles);


                }

            }

            @Override
            public void onFailure(Call<List<Model_Article>> call, Throwable t) {

            }
        });

    }
}
答案

首先,您必须在成功或未获取数据时禁用SwipeRefreshLayout旋转:

swipeRefresh_home.setRefreshing(false);

如果你不这样做,旋转器将一直旋转。

另一个问题是您有一个片段,并尝试为其分配Nav_Home片段和Nav_Profile片段。

Fragment fragment;

public void displayDefaultFragment() {
    fragment = new Nav_Home();
    fragmentManager.beginTransaction().replace(R.id.navContent, fragment).commit();
}

public void showProfileFragment() {
    fragment = new Nav_Profile();
    fragmentManager.beginTransaction().replace(R.id.navContent, fragment).addToBackStack(null).commit();
}

尝试将它们分开并显示如下:

Fragment homeFragment;
Fragment profileFragment;

public void displayDefaultFragment() {
    homeFragment = new Nav_Home();
    fragmentManager.beginTransaction().replace(R.id.navContent, homeFragment).commit();
}

public void showProfileFragment() {
    profileFragment = new Nav_Profile();
    fragmentManager.beginTransaction().replace(R.id.navContent, profileFragment).addToBackStack(null).commit();
}

以上是关于导航抽屉背压片段无法加载的主要内容,如果未能解决你的问题,请参考以下文章

使用导航抽屉旋转时的片段更改

当我在导航抽屉中使用带有发送片段的 EditText 时,无法解析片段中的方法“findViewById”? [复制]

滑出保持突出显示的导航项

导航抽屉,处理后退按钮以转到以前的片段?

如何在导航抽屉中的两个片段之间传递数据

在导航抽屉中管理片段