Android 导航抽屉项目未注册点击事件
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21941570/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Navigation drawer Items not registering click event
提问by J4C3N-14
I am struggling to get the Navigation drawer items to register and start and intent for a new activity. The drawer opens fine and is displayed correctly but nothing happens when I click on the items in the list. Here is my code that is taken from the google tutorials.
我正在努力让导航抽屉项目注册并开始和意图进行新的活动。抽屉打开正常并且显示正确,但是当我单击列表中的项目时没有任何反应。这是我从谷歌教程中获取的代码。
mTitle = mDrawerTitle = getTitle();
mTitles = getResources().getStringArray(R.array.menu_items);
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerList = (ListView) findViewById(R.id.left_drawer);
// set a custom shadow that overlays the main content when the drawer opens
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START);
// set up the drawer's list view with items and click listener
mDrawerList.setAdapter(new ArrayAdapter<String>(this,
R.layout.drawer_list_item, mTitles));
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
// enable ActionBar app icon to behave as action to toggle nav drawer
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
// ActionBarDrawerToggle ties together the the proper interactions
// between the sliding drawer and the action bar app icon
mDrawerToggle = new ActionBarDrawerToggle(
this, /* host Activity */
mDrawerLayout, /* DrawerLayout object */
R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
R.string.drawer_open, /* "open drawer" description for accessibility */
R.string.drawer_close /* "close drawer" description for accessibility */
) {
public void onDrawerClosed(View view) {
getActionBar().setTitle(mTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle(mDrawerTitle);
invalidateOptionsMenu(); // creates call to onPrepareOptionsMenu()
}
};
mDrawerLayout.setDrawerListener(mDrawerToggle);
// if (savedInstanceState == null) {
selectItem(0);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.main, menu);
return super.onCreateOptionsMenu(menu);
}
/* Called whenever we call invalidateOptionsMenu() */
@Override
public boolean onPrepareOptionsMenu(Menu menu) {
// If the nav drawer is open, hide action items related to the content view
boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
// menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
return super.onPrepareOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// The action bar home/up action should open or close the drawer.
// ActionBarDrawerToggle will take care of this.
if (mDrawerToggle.onOptionsItemSelected(item)) {
return true;
}
return super.onOptionsItemSelected(item);
}
/* The click listner for ListView in the navigation drawer */
private class DrawerItemClickListener implements ListView.OnItemClickListener {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItem(position);
}
}
private void selectItem(int position) {
switch (position) {
case 1:
new DataTask(MainActivity.this).execute();
MainActivity.this.finish();//Set this Activity to Finish so no loop back
Intent intent=new Intent(MainActivity.this,SplashScreen.class);
startActivity(intent);
break;
case 2:
// ft.replace(R.id.content_frame, new SecondFragment());
// setTitle("Second");
break;
case 3:
// ft.replace(R.id.content_frame, new ThirdFragment());
// setTitle("Third");
break;
default:
break;
}
// update selected item and title, then close the drawer
mDrawerList.setItemChecked(position, true);
//setTitle(mTitles[position]);
mDrawerLayout.closeDrawer(mDrawerList);
}
@Override
public void setTitle(CharSequence title) {
mTitle = title;
getActionBar().setTitle(mTitle);
}
/**
* When using the ActionBarDrawerToggle, you must call it during
* onPostCreate() and onConfigurationChanged()...
*/
@Override
protected void onPostCreate(Bundle savedInstanceState) {
super.onPostCreate(savedInstanceState);
// Sync the toggle state after onRestoreInstanceState has occurred.
mDrawerToggle.syncState();
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
// Pass any configuration change to the drawer toggls
mDrawerToggle.onConfigurationChanged(newConfig);
}
/**
* Fragment that appears in the "content_frame", shows a planet
*/
public static class PlanetFragment extends Fragment {
public static final String ARG_PLANET_NUMBER = "planet_number";
public PlanetFragment() {
// Empty constructor required for fragment subclasses
}
// @Override
/* public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_planet, container, false);
int i = getArguments().getInt(ARG_PLANET_NUMBER);
String planet = getResources().getStringArray(R.array.planets_array)[i];
int imageId = getResources().getIdentifier(planet.toLowerCase(Locale.getDefault()),
"drawable", getActivity().getPackageName());
((ImageView) rootView.findViewById(R.id.image)).setImageResource(imageId);
getActivity().setTitle(planet);
return rootView; */
}
If you can provide any help that would be great as I am really pulling my hair out on this. Thank you.
如果您能提供任何帮助,那将是很棒的,因为我真的很想解决这个问题。谢谢你。
回答by user3798518
The problem is the z ordering. When you expand the list in onDrawerOpened
put:
问题是 z 排序。当您在onDrawerOpened
put 中展开列表时:
mDrawerList.bringToFront();
mDrawerLayout.requestLayout();
In this post explain the problem and how fix it: http://vardhan-justlikethat.blogspot.com.es/2014/05/android-custom-navigation-drawer-not.html
在这篇文章中解释问题以及如何解决它:http: //vardhan-justlikethat.blogspot.com.es/2014/05/android-custom-navigation-drawer-not.html
回答by aobrazcova
Fixed a similar issue by adding drawerView.bringToFront();
to
通过添加drawerView.bringToFront();
到修复了类似的问题
@Override
public void onDrawerOpened(View drawerView) {
}
回答by Kunal
If you have a list in Navigation Drawer then just write the code and make listview clickable:
如果您在 Navigation Drawer 中有一个列表,那么只需编写代码并使列表视图可点击:
list.bringToFront();
drawerLayout.requestLayout();
回答by user157745
You should check if you have android:animateLayoutChanges="true"
attribute on ListView parent(in layout resource).
Removing that attribute worked for me.
您应该检查您是否android:animateLayoutChanges="true"
在 ListView 父级(在布局资源中)上具有属性。删除该属性对我有用。
回答by obolsh
I also had a problem with not responding on clicks navigation driver. Somehow I have found a solution: problem was in XML file. I used this and my problem was gone:
我也遇到了点击导航驱动程序没有响应的问题。不知何故,我找到了一个解决方案:问题出在 XML 文件中。我使用了这个,我的问题消失了:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- As the main content view, the view below consumes the entire
space available using match_parent in both dimensions. -->
<FrameLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<!-- android:layout_gravity="start" tells DrawerLayout to treat
this as a sliding drawer on the left side for left-to-right
languages and on the right side for right-to-left languages.
The drawer is given a fixed width in dp and extends the full height of
the container. A solid background is used for contrast
with the content view. -->
<ListView
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="@android:color/transparent"
android:dividerHeight="0dp"
android:background="#ffff"/>
hope this will be usefull.
希望这将是有用的。
回答by Endzeit
It seems like the your DrawerItemClickListener.class
does not work as the only time the selectItem()
method is called is at the end of your activities onCreate()
at selectItem(0);
似乎您DrawerItemClickListener.class
的selectItem()
方法不起作用,因为该方法被调用的唯一时间是在您的活动结束onCreate()
时selectItem(0);
Instead of calling
而不是打电话
mDrawerList.setOnItemClickListener(new DrawerItemClickListener());
you can use this
as a parameter and let you Activity
implement the ListView.OnItemClickListener
itself.
您可以将其this
用作参数并让您Activity
实现它ListView.OnItemClickListener
本身。
public class MyActivity extends Activity implements ListView.OnItemClickListener {
public void onCreate(Bundle savedInstanceState) {
[...]
mDrawerList = (ListView) findViewById(R.id.left_drawer);
[...]
mDrawerList.setOnItemClickListener(this);
[...]
}
[...]
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
selectItem(position);
}
private void selectItem(int position) {
switch (position) {
case 1:
[...]
startActivity(new Intent(this, SplashScreen.class));
break;
[...]
default:
break;
}
[...]
}
[...]
}