簡體   English   中英

從導航抽屜中選擇其他選項並返回后,導航抽屜內的 VIew pager 不顯示片段

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

謝謝你的關注

在導航抽屜片段中實現 viewpager 時,我遇到了一些問題。 例如,我有一個帶有兩個片段 fragment1 和 fragment2 的導航抽屜,如圖所示。 當活動啟動時,fragment1 會很好地顯示其 viewpager 片段。 但是當我 go 到片段 2 並返回到 fragment1 時,viewpager 中的片段就會消失並顯示空白。 如果您有任何答案,請提出一些建議。

截圖在此處輸入圖像描述

提前致謝

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


}

片段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);
}
}

我只是使用一個簡單的技巧就解決了。 在我的TabPagerAdapter類中,我使用了getChildFragmentManager()而不是getFragmentManager() 我不知道這有什么幫助,但確實有幫助。

一個非常好的實踐感謝提要,是始終檢查 viewpager 是否為空,或者 null。有了這個,看到導航的深度,在應用程序中,片段中的一個關鍵是上下文管理,除了傳統的“這個”活動和另一個也是很好地管理實例和實例密鑰,以便在檢索它們時。 由於 state 或我離開它的地方或之前在片段級別導航,導航對用戶來說很舒服。

在主要或片段中

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

如果你使用 viepager

pagerAdapter = new ViewPageAdapter(getChildFragmentManager());

代替

pagerAdapter = new ViewPageAdapter(getFragmentManager());

當你在 menudrawer 或 material ui 等不同地方處理很多 fragments 時,記得使用它們的 keys for the instances 並保存它們以調用它們並恢復以前的 state。

在 viewpager 的內部或外部,我們通過抽屜菜單添加導航,然后處理實例調用的深度片段。 更有趣的是,如果流程的周期管理不善,那么即使做得很好的代碼也會出現故障。 檢索實例是隱式操作的確切步驟。

快樂的代碼!

有用的鏈接:

暫無
暫無

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

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