android - 使用新工具栏组件、隐藏和显示抽屉导航图标、Home Up 图标从 fragment 中单击事件的问题

标签 android android-fragments navigation-drawer android-navigation android-toolbar

我最近开始更新我的应用程序,以使用 Android 5.0 中引入的带有抽屉导航的新工具栏组件。应用程序的流程是:MainActivity,它有一个工具栏、带菜单的抽屉导航 1. 主页 2. 购物车。

主页菜单通过其中的一个按钮导航到“主页详细信息”。

“MainActivity”的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<include
    android:id="@+id/toolbar"
    layout="@layout/toolbar" />
<android.support.v4.widget.DrawerLayout
    android:id="@+id/drawer"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <FrameLayout android:id="@+id/activity_frame" 
         android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="@android:color/white"
        android:choiceMode="singleChoice"
        android:divider="@android:color/transparent"
        android:dividerHeight="0dp"
        android:listSelector="@android:color/transparent" />
</android.support.v4.widget.DrawerLayout>

我在从抽屉中选择的菜单的“MainActivity”上添加两个 fragment HomeFragment,CartFragment,默认选择位置 0,即“Home”

类“MainActivity.java”::

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTitle = mDrawerTitle = getTitle();     
    drawer = (DrawerLayout) findViewById(R.id.drawer);
    mToolbar = (Toolbar) findViewById(R.id.toolbar);
    tvTitle = (TextView) mToolbar.findViewById(R.id.toolbar_title);
    if (mToolbar != null) {
        setSupportActionBar(mToolbar);          
    }       
    mDrawerToggle = new ActionBarDrawerToggle(this, drawer,mToolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close) {
        public void onDrawerClosed(View view) {
            getSupportActionBar().setTitle(mTitle);
        }

        public void onDrawerOpened(View drawerView) {
            getSupportActionBar().setTitle(mDrawerTitle);
        }
    };
    drawer.setDrawerListener(mDrawerToggle);        
    mDrawerList = (ListView) findViewById(R.id.left_drawer);    
    dataList = new ArrayList<DrawerItem>();
    dataList.add(new DrawerItem(Constants.V_HOME, R.drawable.ic_launcher));
    dataList.add(new DrawerItem(Constants.V_MY_CART, R.drawable.ic_launcher));  
    mDrawerList.setAdapter(adapterDrawer);      
    mDrawerList.setOnItemClickListener(new DrawerItemClickListener());      
    // to show first "Home fragment" on start up of application
    if(savedInstanceState==null)
        SelectItem(0);
}
public void SelectItem(int position) {
    Fragment fragment = null;
    switch (position) {
    case 0:
        fragment = new HomeFragment();
        replaceFragment(fragment, Constants.V_TAG_HOME,false,"Home");
        break;
    case 1:
        fragment = new CartFragment();
        replaceFragment(fragment, Constants.V_TAG_MY_CART,false,"My Cart");
        break;
    }           
    drawer.closeDrawer(mDrawerList);
}
public void replaceFragment(Fragment fragment,String fragment_tag,boolean showHome,String title){   
    frgManager = this.getSupportFragmentManager();
    FragmentTransaction ft  = frgManager.beginTransaction();
    ft.replace(R.id.activity_frame,fragment,fragment_tag);      
    if(showHome)
        ft.addToBackStack(null);
    ft.commit();            
    shouldDisplayHomeUp(showHome);
}
public void shouldDisplayHomeUp(boolean showHome){
    if(showHome){
        mDrawerToggle.setDrawerIndicatorEnabled(false);
        drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED);
        getSupportActionBar().setHomeButtonEnabled(true);   
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }else{
        mDrawerToggle.setDrawerIndicatorEnabled(true);
        drawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED);
        getSupportActionBar().setDisplayHomeAsUpEnabled(false);
        getSupportActionBar().setHomeButtonEnabled(false);
    }
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {         
    getMenuInflater().inflate(R.menu.main, menu);
      return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {   
    switch (item.getItemId()) 
       {        
          case android.R.id.home:            
               Toast.makeText(getApplicationContext(),"main act  clicked", Toast.LENGTH_SHORT).show();      
             return false;        
          default:            
             return super.onOptionsItemSelected(item);    
       }
}
@Override
public void onBackPressed() {
    // TODO Auto-generated method stub      
    if(frgManager.getBackStackEntryCount()>0){      
           getSupportFragmentManager().popBackStack();      
           // show the drawer icon when on moving back 
           shouldDisplayHomeUp(false);         
        }else{
            super.onBackPressed();
        }
    mDrawerToggle.syncState();
}

我的主页 fragment 在单击按钮时有按钮“详细信息”,替换为其他 fragment :“HomeDetailFragment”

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
    android:id="@+id/btnDetail"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Home detail" />
<FrameLayout
    android:id="@+id/home_frame_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />
</LinearLayout>

class "HomeFragment.java"btnDetail click 事件替换其他 fragment "HomeDetailFragment"::

btnDetail.setOnClickListener(new View.OnClickListener() {           
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            Fragment fragment = new HomeDetailFragment();
            ((MainActivity)getActivity()).showDrawerIndicator(false);
            FragmentManager frManager = getActivity().getSupportFragmentManager();
            FragmentTransaction ft  = frManager.beginTransaction();
            ft.addToBackStack(null);
            ft.replace(R.id.activity_frame, fragment).commit();
        }
});

类“HomeDetailFragment.java”::

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setHasOptionsMenu(true);    
    // update the actionbar to show the up carat/affordance 
    ((MainActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // TODO Auto-generated method stub
    super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {       
    switch (item.getItemId()) {
    case android.R.id.home:    
            // your code for order here
        Toast.makeText(getActivity(), "home detail", Toast.LENGTH_LONG).show(); 
        ((MainActivity)getActivity()).onBackPressed();          
     return true;
    }
    return true;
}

我的问题::

<强>1。在“HomeDetailFragment”中,我可以看到“UP 主页图标”,但无法获取主页图标 onOptionsItemSelected 未被调用的点击事件,因此无法导航回 HomeFragment

<强>2。当按下电话后退按钮并再次导航到“主页详细信息”时,它没有显示“UP 主页图标”

请指导我。

最佳答案

  1. In "HomeDetailFragment", I can see the "UP home icon" but cannot get the click event of home icon onOptionsItemSelected not being called, so cant navigate back to HomeFragment

实现此目的的一种方法是使用 MainActivity 中的 Toolbar,如下所示:

Toolbar mToolbar= ((MainActivity)getActivity()).mToolbar;
mToolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_nav_back));
mToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("MrE", "home selected");
            }
        });

  1. When pressing the Phone Back Button, and again navigating to "Home Detail" it is not showing "UP home icon"

你的代码没有被调用的原因是因为它在你的 fragment 的 onCreate 中。将其移动到 onCreateOptionsMenu 而不是让它更新。

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    // Put toolbar stuff from above here
    super.onCreateOptionsMenu(menu, inflater);
}

关于android - 使用新工具栏组件、隐藏和显示抽屉导航图标、Home Up 图标从 fragment 中单击事件的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27270722/

相关文章:

android - 抽屉导航中的可折叠列表项

android - 如何在一个 android studio 项目中为两种不同类型的用户设置两个不同的抽屉导航 Activity ?

java - 安卓模拟器 : Process finished with exit code -529697949

java - 将 xml 字符串数组中的项目添加到 fragment 内的回收器 View 中

android - 从 ViewPager 中的 Fragments 调用 Adapter

android - 无法访问 fragment 方法中的 View 。它返回空对象

android - Android 中的三维数组

android - 如何使用 Firebase ML Kit 在图像中查找标记?

android - 更改 NumberPicker 文本大小

android - 没有操作栏的抽屉导航,android