[英]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.