2013-05-24 18 views
35

私はアンドロイドプロジェクトで作業していますが、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. 
     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; 
     } 
    } 
} 

おかげです。

答えて

140

あなたは魔法が起こる場所です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); 
    } 
+10

ありがとうございます。何度もドキュメントをチェックして何度もそれを見逃してしまったことが何回もわかりません。助けてくれてありがとう – Boardy

+8

Omg、私は2時間のように失ってしまった... – Enrichman

+0

上記のコードを入れないと、上のアクションバーが欲しくないのですが? – cafebabe1991

4

を、あなたは(OPを持っていますが、私は削除していたもの)このメソッドが欠落することができます:

@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
    super.onPostCreate(savedInstanceState); 
    mDrawerToggle.syncState(); 
} 
+1

'onPostCreate'でそれを呼び出すことが本当に重要です..' onCreate'ではうまくいきません!おかげで – josemigallas

+1

これは私が探していたバーガーのアイコンをもたらしました。ありがとう:) –

0

私の仕事です。

drawerToggle.setToolbarNavigationClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mDrawer.openDrawer(GravityCompat.START); 
     } 
    }); 
0

ここで私はアンドロイドstudio.Iの使用せずにアンドロイドに引き出しナビゲーションを作成するためにあなたにシンプルで簡単な方法を教えてくれるだけで、ナビゲーション引き出しを作成するために、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> 
    <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(); 
    } 
    } 

あなたは、左から引っ張っ)ボタン、2をクリックして、引き出し1)を開くことができます3)アクションバーの引き出しアイコンをクリックすると開くことができます.3つのオプションがあります。

注:drawerLayoutは、コードに示すようにルート要素である必要があります。 とし、onConfigurationChanged()、onOptionsItemSelected()、onPostCreate()を保持します。 この3つの方法は、ナビゲーションドロワーを作成するために非常に重要です。

運が良かった!

関連する問題