无法捕获工具栏主页按钮单击事件 [英] Cannot catch toolbar home button click event
问题描述
我已经实现了最新的 appcompat 库并使用 Toolbar
作为操作栏.但问题是我无法捕捉主页按钮/汉堡包图标点击事件.我已经尝试并查看了所有内容,但似乎没有发现类似的问题.
I've implemented the newest appcompat library and using the Toolbar
as action bar. But the problem is I cannot catch the home button / hamburger icon click event. I've tried and looked everything but doesn't seem to find a similar problem.
这是我的 Activity
类:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
// Set up the drawer.
navDrawerFragment =
(NavigationDrawerFragment) getSupportFragmentManager()
.findFragmentById(R.id.navigation_drawer);
navDrawerFragment.setUp(
R.id.navigation_drawer,
(DrawerLayout) findViewById(R.id.drawer_layout),
toolbar);
}
这是我的 NavigationDrawerFragment 类:
And this is my NavigationDrawerFragment class :
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
currentSelectedPosition = savedInstanceState.getInt(
STATE_SELECTED_POSITION);
fromSavedInstanceState = true;
}
// Select either the default item (0) or the last selected item.
selectItem(currentSelectedPosition);
}
@Override
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Indicate that this fragment would like
// to influence the set of actions in the action bar.
setHasOptionsMenu(true);
}
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
drawerListView = (ListView) inflater.inflate(
R.layout.fragment_navigation_drawer, container, false);
drawerListView.setOnItemClickListener(
new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent,
View view, int position, long id) {
selectItem(position);
}
});
//mDrawerListView.setAdapter();
//mDrawerListView.setItemChecked(mCurrentSelectedPosition, true);
return drawerListView;
}
public void setUp(int fragmentId, DrawerLayout drawerLayout, Toolbar toolbar) {
fragmentContainerView = getActivity().findViewById(fragmentId);
this.drawerLayout = drawerLayout;
// set a custom shadow that overlays the main
// content when the drawer opens
drawerLayout.setDrawerShadow(
R.drawable.drawer_shadow, GravityCompat.START);
// set up the drawer's list view
// with items and click listener
ActionBar actionBar = getActionBar();
actionBar.setDisplayHomeAsUpEnabled(true);
actionBar.setHomeButtonEnabled(true);
// ActionBarDrawerToggle ties together the the proper interactions
// between the navigation drawer and the action bar app icon.
drawerToggle = new ActionBarDrawerToggle(
getActivity(),
drawerLayout,
toolbar,
R.string.navigation_drawer_open,
R.string.navigation_drawer_close) {
public void onDrawerClosed(View view) {
super.onDrawerClosed(view);
}
public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
}
};
// If the user hasn't 'learned' about the drawer,
// open it to introduce them to the drawer,
// per the navigation drawer design guidelines.
if (!userLearnedDrawer && !fromSavedInstanceState) {
drawerLayout.openDrawer(fragmentContainerView);
}
// Defer code dependent on restoration of previous instance state.
drawerLayout.post(new Runnable() {
@Override
public void run() {
drawerToggle.syncState();
}
});
drawerLayout.setDrawerListener(drawerToggle);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt(STATE_SELECTED_POSITION, currentSelectedPosition);
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Forward the new configuration the drawer toggle component.
drawerToggle.onConfigurationChanged(newConfig);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
super.onCreateOptionsMenu(menu, inflater);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Log.d("cek", "item selected");
if (drawerToggle.onOptionsItemSelected(item)) {
Log.d("cek", "home selected");
return true;
}
return super.onOptionsItemSelected(item);
}
当我单击菜单项时,会调用日志所选项目".但是,当我单击主页按钮时,它会打开导航抽屉,但永远不会调用日志已选择主页".我也在我的 Activity
中设置了 onOptionsItemSelected
方法,但它仍然没有被调用.
when I clicked a menu item, the log "item selected" gets called. But when I click on the home button, it opens navigation drawer but the log "home selected" never get called. I've set onOptionsItemSelected
method inside my Activity
as well, but it still doesn't get called.
推荐答案
如果你想知道点击 home 的时间是一个 AppCompatActivity
那么你应该像这样尝试:
If you want to know when home is clicked is an AppCompatActivity
then you should try it like this:
首先告诉 Android 你想使用你的 Toolbar
作为你的 ActionBar
:
First tell Android you want to use your Toolbar
as your ActionBar
:
setSupportActionBar(toolbar);
然后通过 setDisplayShowHomeEnabled
将 Home 设置为显示如下:
Then set Home to be displayed via setDisplayShowHomeEnabled
like this:
getSupportActionBar().setDisplayShowHomeEnabled(true);
最后像往常一样监听 android.R.id.home
上的点击事件:
Finally listen for click events on android.R.id.home
like usual:
@Override
public boolean onOptionsItemSelected(MenuItem menuItem) {
if (menuItem.getItemId() == android.R.id.home) {
Timber.d("Home pressed");
}
return super.onOptionsItemSelected(menuItem);
}
如果您想知道何时在 AppCompatActivity
以外的类中的 Toolbar
上单击导航按钮,您可以使用这些方法设置导航图标并监听点击事件就可以了.导航图标将出现在您的工具栏
的左侧,该位置以前是主页"按钮.
If you want to know when the navigation button is clicked on a Toolbar
in a class other than AppCompatActivity
you can use these methods to set a navigation icon and listen for click events on it. The navigation icon will appear on the left side of your Toolbar
where the the "home" button used to be.
toolbar.setNavigationIcon(getResources().getDrawable(R.drawable.ic_nav_back));
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("cek", "home selected");
}
});
如果你想知道汉堡什么时候被点击以及抽屉什么时候打开,你已经在通过 onDrawerOpened
和 onDrawerClosed
监听这些事件,所以你会想要看看这些回调是否符合您的要求.
If you want to know when the hamburger is clicked and when the drawer opens, you're already listening for these events via onDrawerOpened
and onDrawerClosed
so you'll want to see if those callbacks fit your requirements.
这篇关于无法捕获工具栏主页按钮单击事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!