簡體   English   中英

在片段上添加導航抽屜

[英]Add navigation drawer on fragment

我有一個活動包含左側導航抽屜的應用程序。 此活動還動態加載不同的片段。

現在的重點是:我想在片段加載上附加一個不同的右側抽屜(以實現一些過濾器),並將其附加到每個片段上。

我試圖在MyFragment.onAttach(...)方法中復制並重新使用navigationDrawer.setUp(int fragmentId, DrawerLayout drawerLayout)代碼,但使用mFragmentContainerView = getActivity().findViewById(R.id.filter_drawer);獲得NullPointerException mFragmentContainerView = getActivity().findViewById(R.id.filter_drawer); (我認為getActivity()。findViewById(...)找不到任何東西)。

這是從自動生成的NavigationDrawerFragment中復制的代碼,我將其放入CustomerFragment中:

mFragmentContainerView = getActivity().findViewById(R.id.filter_drawer);
mDrawerLayout = (DrawerLayout) activity.findViewById(R.id.drawer_layout);

// set a custom shadow that overlays the main content when the drawer opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);

mDrawerToggle = new ActionBarDrawerToggle(
    getActivity(),                    /* host Activity */
    mDrawerLayout,                    /* DrawerLayout object */
    R.drawable.ic_drawer,             /* nav drawer image to replace 'Up' caret */
    R.string.navigation_drawer_open,  /* "open drawer" description for accessibility */
    R.string.navigation_drawer_close  /* "close drawer" description for accessibility */
) {
@Override
public void onDrawerClosed(View drawerView) {
    super.onDrawerClosed(drawerView);
    if (!isAdded()) {
        return;
    }

    getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}

@Override
public void onDrawerOpened(View drawerView) {
    super.onDrawerOpened(drawerView);
    if (!isAdded()) {
        return;
    }

    if (!mUserLearnedDrawer) {
        // The user manually opened the drawer; store this flag to prevent auto-showing
        // the navigation drawer automatically in the future.
        mUserLearnedDrawer = true;
        SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(getActivity());
        sp.edit().putBoolean(PREF_USER_LEARNED_DRAWER, true).apply();
    }

    getActivity().invalidateOptionsMenu(); // calls onPrepareOptionsMenu()
}
};

// If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer,
// per the navigation drawer design guidelines.
if (!mUserLearnedDrawer && !mFromSavedInstanceState) {
    mDrawerLayout.openDrawer(mFragmentContainerView);
}

// Defer code dependent on restoration of previous instance state.
mDrawerLayout.post(new Runnable() {
    @Override
    public void run() {
        mDrawerToggle.syncState();
    }
});

mDrawerLayout.setDrawerListener(mDrawerToggle);

我已經在網上搜索了一個解決方案,但是每個人都與我想要的相反:“通過導航抽屜管理片段”,而我希望“在片段上自定義導航抽屜”。

我該如何實現?

看到這段代碼,我已經使用了意圖,而不是片段

public class MainActivity extends Activity {
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;

    private CharSequence mDrawerTitle;
    private CharSequence mTitle;
    private LinearLayout mDrawer1;
    private String[] navMenuTitles;
    private TypedArray navMenuIcons;

    private ArrayList<NavDrawerItem> navDrawerItems;
    private NavDrawerListAdapter adapter;

    Fragment[] allFrgaments;
    public int curFrag = -1;
    FragmentTransaction ft;
    FragmentManager fm;
    ImageView ivtophomeslide;

    Activity activity;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.slidingmenu);
        activity = MainActivity.this;

        allFrgaments = new Fragment[] { new HomeFragment(),
                new AccountFragment(), new SavedLocationFragment(),
                new BecomeDriverFragment(), new InviteFragment(),
                new DiscountFragment(), new RecentTripsFragment() };

        mTitle = mDrawerTitle = getTitle();

        navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

        navMenuIcons = getResources()
                .obtainTypedArray(R.array.nav_drawer_icons);
        mDrawer1 = (LinearLayout) findViewById(R.id.drawer1);
        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.list_slidermenu);

        navDrawerItems = new ArrayList<NavDrawerItem>();

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

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

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

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

        navMenuIcons.recycle();

        mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

        adapter = new NavDrawerListAdapter(getApplicationContext(),
                navDrawerItems);
        mDrawerList.setAdapter(adapter);

        getActionBar().setDisplayHomeAsUpEnabled(true);
        // getActionBar().setHomeButtonEnabled(true);
        getActionBar().setBackgroundDrawable(
                new ColorDrawable(getResources().getColor(R.color.light_blue)));
        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.menu_m, R.string.app_name,

                R.string.app_name) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);

                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);

                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {

            displayView(0);
        }
    }

    private class SlideMenuClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {

            displayView(position);

        }
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        return false;

    }

    public void switchFrag(int position, Activity act) {
        try {
            Log.e("tag", "clicked" + position);
            Log.e("tag", "current :-" + curFrag);
            if (curFrag != position) {
                curFrag = position;
                ft = act.getFragmentManager().beginTransaction();
                ft.replace(R.id.frame_container, allFrgaments[position], ""
                        + position);
                ft.commit();
                displayView(position);
                mDrawerList.setItemChecked(position, true);
                mDrawerList.setSelection(position);
                mDrawerLayout.closeDrawer(mDrawer1);
                setTitle(navMenuTitles[position]);
            } else {
                Log.e("test", "else part fragment ");
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    private void displayView(int position) {

        switch (position) {
        case 0:

            switchFrag(0, activity);
            mDrawerLayout.closeDrawer(mDrawer1);

            break;
        case 1:

            switchFrag(1, activity);
            mDrawerLayout.closeDrawer(mDrawer1);

            break;
        case 2:

            switchFrag(2, activity);
            mDrawerLayout.closeDrawer(mDrawer1);

            break;
        case 3:

            switchFrag(3, activity);
            mDrawerLayout.closeDrawer(mDrawer1);

            break;

        case 4:

            switchFrag(4, activity);
            mDrawerLayout.closeDrawer(mDrawer1);

            break;
        case 5:
            switchFrag(5, activity);
            mDrawerLayout.closeDrawer(mDrawer1);
            break;
        case 6:
            switchFrag(6, activity);
            mDrawerLayout.closeDrawer(mDrawer1);
            break;
        case 7:
            Intent intent = new Intent(this, MainActivityy.class);
            startActivity(intent);
            // switchFrag(7, activity);
            mDrawerLayout.closeDrawer(mDrawer1);
            break;

        default:
            break;
        }

    }

    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getActionBar().setTitle(mTitle);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);

        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);

        mDrawerToggle.onConfigurationChanged(newConfig);
    }
}

您可以通過刪除片段類來做到這一點,並在要關閉抽屜的導航抽屜中,只需添加顯式意圖即可調用另一個導航抽屜類

暫無
暫無

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

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