Кнопка "Движущаяся панель навигации" не работает

Я работаю над проектом Android, и я пытаюсь интегрировать новый навигационный ящик, используя пример из http://developer.android.com/training/implementing-navigation/nav-drawer.html.

В основном он работает, за исключением одной вещи, кнопка панели действий не отображает меню, но если я проведу пальцем по экрану основного действия с края, тогда появится меню, поэтому я знаю, что нет ничего плохого в том, фактическое меню, его просто кнопка панели действий.

Ниже приведен код

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.
 ***************().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;
 }
 }
}
</menuitem>

Спасибо за любую помощь, которую вы можете предоставить.

4 ответа

Вы забыли реализовать 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);
 }
 });


Здесь я расскажу вам ПРОСТОЙ И ЛЕГКИЙ способ создания навигации на ящике в андроиде без использования android studio. Я только что использовал ADT для создания навигационного ящика. Вот код взглянуть

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 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">
 </textview></relativelayout></button></textview></relativelayout></android.support.v4.widget.drawerlayout><button android:id="@+id/bt2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click to open d"><code>
 
</code>
<p>MainActivity.java</p>
<pre class="prettyprint linenums">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), нажав на кнопку, 2) потянув слева, 3) щелкнув значок ящика на панели действий. Вы хотите, чтобы вы могли открыть его. Я дал вам три варианта.

note: drawerLayout должен быть корневым элементом, как показано в коде. и продолжайте onConfigurationChanged(), onOptionsItemSelected(), onPostCreate(). эти три метода очень важны для создания ящика навигации.

Удачи!

licensed under cc by-sa 3.0 with attribution.