2014-11-27 3 views
0

Android v7에서 ActionBarDrawerToggle을 사용하여 CustomActionBar를 만들려고합니다. 내 프로젝트를 실행하고 열려고 시도하면이 줄에 NullPointeException 예외가 throw됩니다 (setDrawerListener(tg);).ActionBar가 setDrawerListener에서 NullPointerException을 throw합니다.

여기 내가 어떻게 노력하고 있는지. 당신의 오류가 경우 NullPointerException

import android.content.res.Configuration; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v4.widget.DrawerLayout; 
import android.support.v7.app.ActionBar; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.app.ActionBarDrawerToggle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ListView; 
import br.com.williarts.batalhajuridica.R; 
import br.com.williarts.batalhajuridica.frags.PerfilFrag; 

public class CustomDrawerLayout extends ActionBarActivity implements OnItemClickListener{ 
    private ActionBar ab; 
    private DrawerLayout dl; 
    private ListView lv; 
    private ActionBarDrawerToggle tg; 

    private String[] fragments; 
    private CharSequence tl; //titulo principal 
    private CharSequence tlf; //titulo fragment 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_custom_drawerlayout); 
     init(); 

     if(savedInstanceState == null){ 
      selectedItem(0); 
     } 
    } 

    private void init(){ 
     //actionbar 
     onConfigActionBar(); 
     //listview 
     lv = (ListView)findViewById(R.id.lv); 
     fragments = getResources().getStringArray(R.array.itens_menu_string); 
     lv.setAdapter(new DrawerLayoutListViewAdapter(this, fragments)); 
     lv.setOnItemClickListener(this);   
     //drawerlayout 
     dl = (DrawerLayout)findViewById(R.id.drawer_layout); 
     //actionbardrawertoggle 
     tg = new ActionBarDrawerToggle(this, dl, R.drawable.btmenu, R.string.nomeActionBar){ 
      public void onDrawerClosed(View view) { 
       ab.setTitle(tl);     
       supportInvalidateOptionsMenu(); 
      } 

      public void onDrawerOpened(View view) { 
       ab.setTitle(tlf); 
       supportInvalidateOptionsMenu(); 
      } 
     };  
     dl.setDrawerListener(tg); 

     tl = tlf = getTitle();  
    } 

    /** ativa actionbar e botao home na action bar */ 
    private void onConfigActionBar(){ 
     ab = getSupportActionBar(); 
     ab.setDisplayHomeAsUpEnabled(true); 
     ab.setHomeButtonEnabled(true); 
    } 

    @Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     tg.onConfigurationChanged(newConfig); 
    } 

    /** necessario */ 
    @Override 
    protected void onPostCreate(Bundle savedInstanceState) { 
     super.onPostCreate(savedInstanceState); 
     tg.syncState(); 
    } 

    /** necessario */ 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) {   
     if (tg.onOptionsItemSelected(item)) { 
      return true; 
     }    
     return super.onOptionsItemSelected(item); 
    } 


    /** necessario */ 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.custom_drawer_layout, menu); 
     return true; 
    } 

    /** necessario */ 
    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     boolean status = dl.isDrawerOpen(lv); 
     menu.findItem(R.id.action_settings).setVisible(!status); 
     return super.onPrepareOptionsMenu(menu); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position,long id) { 
     selectedItem(position);  
    } 

    /** seleciona o fragment q sera usado */ 
    private void selectedItem(int position){ 
     FragmentTransaction ft; 
     Fragment frag; 
     switch(position){ 
      case 0: 
       frag = new PerfilFrag(); 
       ft = getSupportFragmentManager().beginTransaction(); 
       ft.replace(R.id.fl, frag); 
       ft.commit(); 
       break; 
     } 
     lv.setItemChecked(position, true); 
     setCustomTitle(fragments[position]); 
     dl.closeDrawer(lv); 
    } 

    private void setCustomTitle(String title){ 
     ab.setTitle(title); 
     tl = title; 
    } 
} 

예외

11-27 18:57:50.540: E/AndroidRuntime(31167): FATAL EXCEPTION: main 
11-27 18:57:50.540: E/AndroidRuntime(31167): java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.williarts.batalhajuridica/br.com.williarts.batalhajuridica.draw.CustomDrawerLayout}: java.lang.NullPointerException 
11-27 18:57:50.540: E/AndroidRuntime(31167): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2295) 
11-27 18:57:50.540: E/AndroidRuntime(31167): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2349) 
11-27 18:57:50.540: E/AndroidRuntime(31167): at android.app.ActivityThread.access$700(ActivityThread.java:159) 
11-27 18:57:50.540: E/AndroidRuntime(31167): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316) 
11-27 18:57:50.540: E/AndroidRuntime(31167): at android.os.Handler.dispatchMessage(Handler.java:99) 
11-27 18:57:50.540: E/AndroidRuntime(31167): at android.os.Looper.loop(Looper.java:176) 
11-27 18:57:50.540: E/AndroidRuntime(31167): at android.app.ActivityThread.main(ActivityThread.java:5419) 
11-27 18:57:50.540: E/AndroidRuntime(31167): at java.lang.reflect.Method.invokeNative(Native Method) 
11-27 18:57:50.540: E/AndroidRuntime(31167): at java.lang.reflect.Method.invoke(Method.java:525) 
11-27 18:57:50.540: E/AndroidRuntime(31167): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 
11-27 18:57:50.540: E/AndroidRuntime(31167): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 
11-27 18:57:50.540: E/AndroidRuntime(31167): at dalvik.system.NativeStart.main(Native Method) 
11-27 18:57:50.540: E/AndroidRuntime(31167): Caused by: java.lang.NullPointerException 
11-27 18:57:50.540: E/AndroidRuntime(31167): at br.com.williarts.batalhajuridica.draw.CustomDrawerLayout.init(CustomDrawerLayout.java:65) 
11-27 18:57:50.540: E/AndroidRuntime(31167): at br.com.williarts.batalhajuridica.draw.CustomDrawerLayout.onCreate(CustomDrawerLayout.java:36) 
11-27 18:57:50.540: E/AndroidRuntime(31167): at android.app.Activity.performCreate(Activity.java:5372) 
11-27 18:57:50.540: E/AndroidRuntime(31167): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1104) 
11-27 18:57:50.540: E/AndroidRuntime(31167): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2257) 
11-27 18:57:50.540: E/AndroidRuntime(31167): ... 11 more 

답변

3

, 그것은 단지 두 가지 중 하나가 null이라고 할 수있다. dl이 Null이거나 tg이 Null입니다. tg은 null로 표시되지 않으므로 dl이어야합니다.

당신의 문제는 아마이 라인에 따른된다

dl = (DrawerLayout)findViewById(R.id.drawer_layout); 

이 XML로 이동하여 레이아웃이 ID 이름 "drawer_layout", 당신이 바로 레이아웃을 설정하고 확인을 가지고 있는지 확인하십시오. 기본적으로 그것은 아마도 당신의 잘못입니다.

+1

좋은 캐치! – deeshank

관련 문제