2015-09-11 58 views
0

我想演示一個導航抽屜的例子,但我有一些麻煩,有誰可以幫助我嗎? 這裏是我的代碼:getActionBar()。setDisplayHomeAsUpEnabled(true)

package app.android.example.com.navigationdrawer; 

import android.annotation.SuppressLint; 
import android.annotation.TargetApi; 
import android.content.Intent; 
import android.content.res.Configuration; 
import android.os.Build; 
import android.os.Bundle; 
import android.support.v4.app.ActionBarDrawerToggle; 
import android.support.v4.view.GravityCompat; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBarActivity; 
import android.util.Log; 
import android.view.Gravity; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.widget.Toast; 

import java.util.ArrayList; 

@SuppressLint("NewApi") 
public class MainActivity extends ActionBarActivity { 

    private DrawerLayout mDrawerLayout; 
    private ListView mleftList, mrightList; 
    private ActionBarDrawerToggle mDrawerToggle; 
    private ArrayList arrLeft, arrRight; 

    @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     initArrayForListViewDrawer(); 

     getActionBar().setDisplayHomeAsUpEnabled(true); 
     getActionBar().setHomeButtonEnabled(true); 

     mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); 
     mleftList = (ListView) findViewById(R.id.left_drawer); 
     mrightList = (ListView) findViewById(R.id.right_drawer); 

     mleftList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       switch (position) { 
        case 0: 
         Intent i = new Intent(MainActivity.this, SettingActivity.class); 
         startActivity(i); 
         Toast.makeText(MainActivity.this, "ban da tab chon Setting", Toast.LENGTH_SHORT).show(); 
         break; 
        default: 
         break; 
       } 
       Log.d("debug", "click left " + position); 
       mleftList.setItemChecked(position, true); 
       mDrawerLayout.closeDrawer(mleftList); 
      } 
     }); 

     mrightList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Log.d("debug", "click right " + position); 
       mrightList.setItemChecked(position, true); 
       mDrawerLayout.closeDrawer(mrightList); 
      } 
     }); 

     ItemAdapter adapterLeft = new ItemAdapter(this, arrLeft); 
     mleftList.setAdapter(adapterLeft); 

     ItemAdapter adapterRight = new ItemAdapter(this, arrRight); 
     mrightList.setAdapter(adapterRight); 

     mDrawerLayout.setDrawerShadow(R.drawable.ic_action_favorite, GravityCompat.START); 

     mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.drawable.ic_drawer, 
       R.string.drawer_open, R.string.drawer_close) { 
      public void OnDrawerClosed(View view) { 
       getActionBar().setTitle("Close DrawerLayout"); 
       Log.d("debug", "OnDrawerClose"); 
       invalidateOptionsMenu(); 
      } 

      public void onDrawerOpened(View view) { 
       getActionBar().setTitle("Open DrawerLayout"); 
       Log.d("debug", "OnDrawerOpened"); 
       invalidateOptionsMenu(); 
      } 
     }; 
     mDrawerLayout.setDrawerListener(mDrawerToggle); 
    } 

    private void initArrayForListViewDrawer() { 
     arrLeft = new ArrayList(); 
     arrRight = new ArrayList(); 

     ItemNavigation ItemNavigation1 = new ItemNavigation(R.drawable.ic_action_settings, "Settings"); 
     arrLeft.add(ItemNavigation1); 
     ItemNavigation ItemNavigation2 = new ItemNavigation(R.drawable.ic_action_new, "Add new"); 
     arrLeft.add(ItemNavigation2); 
     ItemNavigation ItemNavigation3 = new ItemNavigation(R.drawable.ic_action_favorite, "Favorite"); 
     arrLeft.add(ItemNavigation3); 
     ItemNavigation ItemNavigation4 = new ItemNavigation(R.drawable.ic_action_collection, "Foder"); 
     arrLeft.add(ItemNavigation4); 
     ItemNavigation ItemNavigation5 = new ItemNavigation(R.drawable.ic_action_about, "About"); 
     arrLeft.add(ItemNavigation5); 
     ItemNavigation ItemNavigation11 = new ItemNavigation(R.drawable.ic_action_settings, "Settings"); 
     arrRight.add(ItemNavigation11); 
    } 

    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     Log.d("debug", "onPostCreate"); 
     mDrawerToggle.syncState(); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     Log.d("debug", "onConfigurationChanged"); 
    } 

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     Log.d("debug", "onPrepareOptionsMenu"); 
     boolean drawerleftOpen = mDrawerLayout.isDrawerOpen(mleftList); 
     menu.findItem(R.id.action_search).setVisible(!drawerleftOpen); 
     menu.findItem(R.id.action_st).setVisible(!drawerleftOpen); 
     boolean drawerrightOpen = mDrawerLayout.isDrawerOpen(mrightList); 
     menu.findItem(R.id.action_search).setVisible(!drawerrightOpen); 
     getActionBar().setDisplayHomeAsUpEnabled(!drawerrightOpen); 
     getActionBar().setHomeButtonEnabled(!drawerrightOpen); 

     return super.onPrepareOptionsMenu(menu); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.action_bar, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     int id = item.getItemId(); 
     switch (id) { 
      case android.R.id.home: 
       Log.d("debug", "click home"); 
       boolean drawerleftOpen = mDrawerLayout.isDrawerOpen(mleftList); 
       if (!drawerleftOpen) { 
        mDrawerLayout.openDrawer(Gravity.START); 
       } else { 
        mDrawerLayout.closeDrawer(mleftList); 
       } 

       break; 
      case R.id.action_st: 
       Log.d("debug", "click setting"); 
       boolean drawerrightOpen = mDrawerLayout.isDrawerOpen(mrightList); 
       if (!drawerrightOpen) { 
        mDrawerLayout.openDrawer(Gravity.END); 
       } else { 
        mDrawerLayout.closeDrawer(mrightList); 
       } 
       break; 

      case R.id.action_search: 
       Log.d("debug", "click Search"); 
       break; 
      default: 
       break; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

這裏是我的佈局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 

    <android.support.v4.widget.DrawerLayout 
     android:layout_height="match_parent" 
     android:layout_width="match_parent" 
     android:id="@+id/drawer_layout"> 

     <FrameLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:id="@+id/framelayout"> 
     </FrameLayout> 

     <ListView 
      android:layout_width="240dp" 
      android:layout_height="match_parent" 
      android:id="@+id/left_drawer" 
      android:layout_gravity="start" 
      android:background="#111" 
      android:choiceMode="singleChoice" 
      android:divider="@android:color/white" 
      android:dividerHeight="0dp" 
      ></ListView> 

     <ListView 
      android:layout_width="240dp" 
      android:layout_height="match_parent" 
      android:id="@+id/right_drawer" 
      android:layout_gravity="end" 
      android:background="#111" 
      android:choiceMode="singleChoice" 
      android:divider="@android:color/transparent" 
      android:dividerHeight="0dp" 
      ></ListView> 

    </android.support.v4.widget.DrawerLayout> 

</RelativeLayout> 

,這裏是日誌顯示:

09-11 13:40:52.371 11674-11674/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: app.android.example.com.navigationdrawer, PID: 11674 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{app.android.example.com.navigationdrawer/app.android.example.com.navigationdrawer.MainActivity}: java.lang.NullPointerException 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184) 
      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) 
      at android.app.ActivityThread.access$800(ActivityThread.java:135) 
      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:136) 
      at android.app.ActivityThread.main(ActivityThread.java:5001) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:515) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.NullPointerException 
      at app.android.example.com.navigationdrawer.MainActivity.onCreate(MainActivity.java:40) 
      at android.app.Activity.performCreate(Activity.java:5231) 
      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148) 
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233) 
            at android.app.ActivityThread.access$800(ActivityThread.java:135) 
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196) 
            at android.os.Handler.dispatchMessage(Handler.java:102) 
            at android.os.Looper.loop(Looper.java:136) 
            at android.app.ActivityThread.main(ActivityThread.java:5001) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:515) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601) 
            at dalvik.system.NativeStart.main(Native Method) 

我不知道什麼是錯的,不知道如何解決此問題。

+2

使用'getSupportActionBar()'而不是'getActionBar()' –

+0

'getActionBar()'在'onCreate'中返回'null'。重複:http://stackoverflow.com/questions/10031180/getactionbar-returns-null – mkasberg

回答

1

這可能是你的主題不是一個帶有操作欄的主題。您也應該使用getSupportActionBar()。儘管如此,最好的做法是將你的操作欄代碼封裝在空檢查中。在某些情況下,操作欄可能尚未在生命週期中創建/設置。

+1

這幫助我,感謝您的建議! – Khuong

2

爲什麼選擇ActionBarActivity?你用AppCompatActivity試過嗎?

此外,你在XML中指定了你的ActionBar?它在toolbar.xml文件中嗎?

toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

請確保您的DrawerLayout xml中包含此項。

相關問題