导航抽屉ActionBarbutton不起作用
我正在处理一个Android项目,我正在尝试使用http://developer.android.com/training/implementing-navigation/nav-drawer.html中的示例来集成新的导航抽屉。
它的主要工作除了一件事情,动作条向上button不显示菜单,但如果我从边缘上的主要活动屏幕上滑动我的手指,然后菜单出现,所以我知道没有任何错误的实际菜单,它只是操作栏button。
下面是代码
public class MainActivity extends Activity { private DrawerLayout mDrawerLayout; private ListView mDrawerList; private ActionBarDrawerToggle mDrawerToggle; private CharSequence mTitle; private CharSequence mDrawerTitle; private String[] mPlanetTitles; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTitle = mDrawerTitle = getTitle(); mPlanetTitles = getResources().getStringArray(R.array.planets_array); mDrawerLayout = (DrawerLayout)findViewById(R.id.drawer_layout); mDrawerList = (ListView)findViewById(R.id.left_drawer); MenuItemAdapter menuAdapter = new MenuItemAdapter(this); menuAdapter.add(new MenuItem("Hello")); menuAdapter.add(new MenuItem("World")); menuAdapter.add(new MenuItem("Parsnips")); menuAdapter.add(new MenuItem("Turnips")); mDrawerList.setAdapter(menuAdapter); mDrawerList.setOnItemClickListener(new DrawerItemClickListener()); getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true); mDrawerToggle = new ActionBarDrawerToggle( this, mDrawerLayout, R.drawable.ic_drawer, R.string.drawer_open, R.string.drawer_closed) { public void onDrawerClosed(View view) { getActionBar().setTitle(mTitle); invalidateOptionsMenu(); } public void onDrawerOpened(View drawerView) { getActionBar().setTitle(mDrawerTitle); invalidateOptionsMenu(); } }; mDrawerLayout.setDrawerListener(mDrawerToggle); if (savedInstanceState == null) { selectItem(0); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } 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) { // update the main content by replacing fragments android.app.Fragment fragment = new PlanetFragment(); Bundle args = new Bundle(); args.putInt(PlanetFragment.ARGS_PLANET_NUMBER, position); fragment.setArguments(args); android.app.FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).commit(); mDrawerList.setItemChecked(position, true); setTitle(mPlanetTitles[position]); mDrawerLayout.closeDrawer(mDrawerList); } @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); } public static class PlanetFragment extends android.app.Fragment { public static final String ARGS_PLANET_NUMBER = "planet_number"; public PlanetFragment() { } @Override public View onCreateView(LayoutInflater inflator, ViewGroup container, Bundle savedInstanceState) { View rootView = inflator.inflate(R.layout.fragment_planet, container, false); int i = getArguments().getInt(ARGS_PLANET_NUMBER); String planet = getResources().getStringArray(R.array.planets_array)[i]; //((TextView)rootView.findViewById(R.id.fragment_text_view)).setText(planet); getActivity().setTitle("Planet: " + planet); return rootView; } } private class MenuItem { public String menuName; public MenuItem(String menuName) { this.menuName = menuName; } } public class MenuItemAdapter extends ArrayAdapter<MenuItem> { public MenuItemAdapter (Context context) { super(context,0); } public View getView (int position, View convertView, ViewGroup parent) { convertView = null; if (convertView == null) { convertView = LayoutInflater.from(getContext()).inflate(R.layout.row_menu_item, null); } /*TextView title = (TextView)convertView.findViewById(R.id.row_title); title.setText(getItem(position).menuName); title.setVisibility(View.VISIBLE);*/ EditText title = (EditText)convertView.findViewById(R.id.row_edittext); title.setHint(getItem(position).menuName); title.setVisibility(View.VISIBLE); return convertView; } } }
感谢您的任何帮助,您可以提供。
你忘了实现onOptionsItemSelected
这是魔术发生的地方:
@Override public boolean onOptionsItemSelected(MenuItem item) { // Pass the event to ActionBarDrawerToggle, if it returns // true, then it has handled the app icon touch event if (mDrawerToggle.onOptionsItemSelected(item)) { return true; } // Handle your other action bar items... return super.onOptionsItemSelected(item); }
对于那些仍然有麻烦的人,你可能会错过这个方法(哪个OP有,但我已经删除):
@Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); mDrawerToggle.syncState(); }
它为我工作。
drawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { @Override public void onClick(View v) { mDrawer.openDrawer(GravityCompat.START); } });
在这里,我会告诉你简单和容易的方式来创buildandroid中的抽屉导航,而不使用android studio.I刚刚使用ADT来创build导航抽屉。 这里是代码看看
activity_main.xml中
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/dr_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <RelativeLayout android:id="@+id/mainContent" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/txt1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="swipe content"/> <Button android:id="@+id/bt1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text = "Click to open d"/> </RelativeLayout> <RelativeLayout android:id="@+id/drawer" android:layout_width="200dp" android:layout_height="match_parent" android:layout_gravity = "start" android:background="#FFFFFF"> <TextView android:id="@+id/txt2" android:layout_width="200dp" android:layout_height="wrap_content" android:text="drawer content are here arr"/> <Button android:id="@+id/bt2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text = "Click to open d"/> </RelativeLayout> </android.support.v4.widget.DrawerLayout>
MainActivity.java
package com.example.drawer1; import android.os.Bundle; import android.annotation.SuppressLint; import android.app.Activity; import android.content.res.Configuration; import android.support.v4.app.ActionBarDrawerToggle; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.DrawerLayout.DrawerListener; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { private DrawerLayout drawerLayout; private View drawerView; Button bt1,bt2; private DrawerListener myDrawerListner; private ActionBarDrawerToggle mDrawerTogle; @SuppressLint("NewApi") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); drawerLayout = (DrawerLayout) findViewById(R.id.dr_layout); drawerView = (View) findViewById(R.id.drawer); drawerLayout.setDrawerListener(myDrawerListner); bt1 = (Button) findViewById(R.id.bt1); bt2 = (Button) findViewById(R.id.bt2); mDrawerTogle =new ActionBarDrawerToggle(this, drawerLayout, R.drawable.ic_drawer,R.string.open_drawer,R.string.close_drawer){ public void onDrawerOpened(View drawerView) { // TODO Auto-generated method stub super.onDrawerOpened(drawerView); getActionBar().setTitle("SpeakEng"); } public void onDrawerClosed(View view) { // TODO Auto-generated method stub super.onDrawerClosed(view); getActionBar().setTitle("SpeakEng"); } }; drawerLayout.setDrawerListener(mDrawerTogle); getActionBar().setDisplayHomeAsUpEnabled(true); getActionBar().setHomeButtonEnabled(true); bt2.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub drawerLayout.closeDrawer(drawerView); } }); bt1.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub drawerLayout.openDrawer(drawerView); } }); } @Override public void onConfigurationChanged(Configuration newConfig){ super.onConfigurationChanged(newConfig); mDrawerTogle.onConfigurationChanged(newConfig); } public boolean onOptionsItemSelected(MenuItem item){ if (mDrawerTogle.onOptionsItemSelected(item)){ return true; } return super.onOptionsItemSelected(item); } @Override protected void onPostCreate(Bundle savedInstanceState){ super.onPostCreate(savedInstanceState); //Sync the toogle state after onRestoreInstanceState has occured. mDrawerTogle.syncState(); } }
您可以打开抽屉1)点击button,2)从左边拉,3)在点击抽屉图标上的行动bar.as你想你可以打开它。我给你三个选项。
注意:drawerLayout必须是代码中所示的根元素。 并保持onConfigurationChanged(),onOptionsItemSelected(),onPostCreate()。 这三种方法对创build导航抽屉非常重要。
祝你好运!