简体   繁体   English

从导航抽屉中选择其他选项并返回后,导航抽屉内的 VIew pager 不显示片段

[英]VIew pager inside navigation drawer doesnt show fragment after selecting other option from navigation drawer and coming back

Thanks for your interest谢谢你的关注

I have faced some problem while implementing viewpager inside navigation drawer fragment.在导航抽屉片段中实现 viewpager 时,我遇到了一些问题。 For example I have a navigation drawer with two fragments fragment1 and fragment2 as shown in the image.例如,我有一个带有两个片段 fragment1 和 fragment2 的导航抽屉,如图所示。 When the activity starts fragment1 shows its viewpager fragments fine.当活动启动时,fragment1 会很好地显示其 viewpager 片段。 But When I go to fragment 2 and come back to fragment1 fragments inside viewpager just dissappears and shows blank.但是当我 go 到片段 2 并返回到 fragment1 时,viewpager 中的片段就会消失并显示空白。 Please suggest some answer if you have any.如果您有任何答案,请提出一些建议。

Screenshots截图在此处输入图像描述

Thanks in advance提前致谢

MainActivity.java MainActivity.java

package com.ansoft.shutterbox;

import android.app.Activity;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.support.v4.app.FragmentManager;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;

public class MainActivity extends FragmentActivity {

public static DrawerLayout mDrawerLayout;
private ListView mDrawerList;
private ActionBarDrawerToggle mDrawerToggle;
ArrayList<ListItemData> data;
// nav drawer title
private CharSequence mDrawerTitle;

// used to store app title
private CharSequence mTitle;

// slide menu items
private String[] navMenuTitles;
private TypedArray navMenuIcons;

private ArrayList<NavDrawerItem> navDrawerItems;
private NavDrawerListAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    insertData();
    mTitle = mDrawerTitle = getTitle();
    navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
    navMenuIcons = getResources()
            .obtainTypedArray(R.array.nav_drawer_icons);
    mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
    mDrawerList = (ListView) findViewById(R.id.list_slidermenu);

    navDrawerItems = new ArrayList<NavDrawerItem>();

    // adding nav drawer items to array
    // Home
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
    // Find People
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
    // Photos
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
    // Communities, Will add a counter here
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1)));
    // Pages
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));
    // What's hot, We  will add a counter here
    navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1)));

    navDrawerItems.add(new NavDrawerItem(navMenuTitles[6], navMenuIcons.getResourceId(6, -1)));


    // Recycle the typed array
    navMenuIcons.recycle();

    mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

    // setting the nav drawer list adapter
    adapter = new NavDrawerListAdapter(MainActivity.this,navDrawerItems);
    mDrawerList.setAdapter(adapter);


    mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
            R.drawable.ic_drawer, //nav menu toggle icon
            R.string.app_name, // nav drawer open - description for accessibility
            R.string.app_name // nav drawer close - description for accessibility
    ) {
        public void onDrawerClosed(View view) {
            // calling onPrepareOptionsMenu() to show action bar icons
            invalidateOptionsMenu();
        }

        public void onDrawerOpened(View drawerView) {
            // calling onPrepareOptionsMenu() to hide action bar icons
            invalidateOptionsMenu();
        }
    };
    mDrawerLayout.setDrawerListener(mDrawerToggle);

    if (savedInstanceState == null) {
        // on first time display view for first nav item
        displayView(0);
    }
    int width=getResources().getDisplayMetrics().widthPixels/3;
    DrawerLayout.LayoutParams params=(android.support.v4.widget.DrawerLayout.LayoutParams)mDrawerList.getLayoutParams();
    params.width=width;
    mDrawerList.setLayoutParams(params);
}

/**
 * Slide menu item click listener
 * */
private class SlideMenuClickListener implements
        ListView.OnItemClickListener {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {
        // display view for selected nav drawer item
        displayView(position);
    }
}

@Override
protected void onResume() {
    Toast.makeText(getApplicationContext(), "Resumed", Toast.LENGTH_LONG).show();
    super.onResume();
}

/**
 * Diplaying fragment view for selected nav drawer list item
 * */
private void displayView(int position) {
    // update the main content by replacing fragments
    Fragment fragment = null;
    switch (position) {
        case 0:
            fragment = new HomeFragment();
            break;
        case 1:
            fragment = new MyProfileFragment();
            break;
        case 2:
            fragment = new EventsFragment();
            break;
        case 3:
            fragment = new TopUpFragment();
            break;
        case 4:
            fragment = new InboxFragment();
            break;
        case 5:
            fragment = new ContactUsFragment();
            break;

        case 6:
            fragment = new SettingsFragment();
            break;

        default:
            break;
    }

    if (fragment != null) {
        FragmentManager fragmentManager = getSupportFragmentManager();
        fragmentManager.beginTransaction()
                .replace(R.id.frame_container, fragment).commit();

        // update selected item and title, then close the drawer
        mDrawerList.setItemChecked(position, true);
        mDrawerList.setSelection(position);
        setTitle(navMenuTitles[position]);
        mDrawerLayout.closeDrawer(mDrawerList);
    } else {
        // error in creating fragment
        Log.e("MainActivity", "Error in creating fragment");
    }
}


}

Fragment1.java片段1.java

package com.ansoft.shutterbox.Fragments;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.HashMap;

public class EventsFragment extends Fragment {

public static ViewPager mViewPager;

public EventsFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {


    super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View cv = inflater.inflate(R.layout.fragment_events, container, false);
    InitializeView(cv);
    ImageView icDrawer = (ImageView)cv.findViewById(R.id.ic_drawer);
    icDrawer.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MainActivity.mDrawerLayout.openDrawer(Gravity.LEFT);
        }
    });
    adapter = new TabPagerAdapter(getFragmentManager());
    mViewPager.setAdapter(adapter);
    tvBacktoList.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ShowNormal();
        }
    });
    mViewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            switch (position) {
                case 0:
                    tab1.setBackgroundResource(R.drawable.bg_event_selected);
                    tab2.setBackgroundColor(getResources().getColor(android.R.color.transparent));
                    imgtab1.setImageResource(R.drawable.ic_list_selected);
                    imgtab2.setImageResource(R.drawable.ic_calender_default);
                    tvtab1.setTextColor(getResources().getColor(R.color.colorPrimary));
                    tvtab2.setTextColor(getResources().getColor(R.color.white));
                    break;

                case 1:
                    tab2.setBackgroundResource(R.drawable.bg_event_selected);
                    tab1.setBackgroundColor(getResources().getColor(android.R.color.transparent));
                    imgtab1.setImageResource(R.drawable.ic_list_default);
                    imgtab2.setImageResource(R.drawable.ic_calender_selected);
                    tvtab1.setTextColor(getResources().getColor(R.color.white));
                    tvtab2.setTextColor(getResources().getColor(R.color.colorPrimary));
                    break;
            }
        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });
    return cv;
}


class TabPagerAdapter extends FragmentPagerAdapter {

    public TabPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0:
                return new EventListFragment();

            case 1:
                return new EventCalenderFragment();
        }
        return null;
    }

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

@Override
public void onAttach(Context context) {
    super.onAttach(context);
}
}

I just solved it by using a simple trick. 我只是使用一个简单的技巧就解决了。 Inside my TabPagerAdapter class I used getChildFragmentManager() instead of getFragmentManager() . 在我的TabPagerAdapter类中,我使用了getChildFragmentManager()而不是getFragmentManager() I dont know how that helped, but it did. 我不知道这有什么帮助,但确实有帮助。

A Really good practice gratefull feed, is to always check that viewpager is not empty, or null. With this, see the depth of navigation, within the application, a key within the fragments is context management, in addition to the traditional "this" activity and another is also to manage the instances and instance keys well so that when they are retrieved.一个非常好的实践感谢提要,是始终检查 viewpager 是否为空,或者 null。有了这个,看到导航的深度,在应用程序中,片段中的一个关键是上下文管理,除了传统的“这个”活动和另一个也是很好地管理实例和实例密钥,以便在检索它们时。 The navigation is comfortable for the user, due to the state or place where I left it or navigated previously at the fragments level.由于 state 或我离开它的地方或之前在片段级别导航,导航对用户来说很舒服。

In Main or Fragment在主要或片段中

 //replace to your inflate code fragment to call viewpager 
 ViewPager viewPager = findViewById(R.id.viewPager);
            if (viewPager != null) {
                ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
                viewPager.setAdapter(adapter);
            }

If youre use a viepager如果你使用 viepager

pagerAdapter = new ViewPageAdapter(getChildFragmentManager());

Instead of代替

pagerAdapter = new ViewPageAdapter(getFragmentManager());

When you handle many fragments in menudrawer or material ui and different places remember to use their keys for the instances and save them to call them and recover the previous state.当你在 menudrawer 或 material ui 等不同地方处理很多 fragments 时,记得使用它们的 keys for the instances 并保存它们以调用它们并恢复以前的 state。

And inside or outside of viewpager, to this we add a navigation by drawer menu then the handling of instances the depth of the invocation in fragments.在 viewpager 的内部或外部,我们通过抽屉菜单添加导航,然后处理实例调用的深度片段。 It is even more interesting to understand how a well-done code can malfunction if the cycles of the processes are not well managed.更有趣的是,如果流程的周期管理不善,那么即使做得很好的代码也会出现故障。 Retrieving the instances is the exact step of the implicit in operation.检索实例是隐式操作的确切步骤。

Happy code!快乐的代码!

Usefull link's:有用的链接:

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM