2016-07-21 8 views
1

Я прочитал @Fabricio PH ответ в this question, чтобы сделать кнопку Toggle на ActionBar.Невозможно обработать Toggle Button на панели действий

Тогда я попробовал второй способ сделать это. Он отображается в панели действий, но я не могу установить на нем какой-либо атрибут.

Это мой код:

main_menu.xml

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:radastaff="http://schemas.android.com/apk/res-auto"> 
    <item android:id="@+id/gps_toggle" 
     android:title="GPS Toggle" 
     radastaff:showAsAction="always" 
     radastaff:actionLayout="@layout/actionbar_layout_toggle" 
     /> 
</menu> 

Макет для этого пункта меню:

action_bar_layout_toggle.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
    <ToggleButton 
     android:id="@+id/actionbar_gps_toggle" 
     android:layout_width="71dp" 
     android:layout_height="30dp" 
     android:textOn="" 
     android:textOff="" 
     android:background="@drawable/gps_status_png" 
     android:layout_marginRight="20dp"/> 
</RelativeLayout> 

В MainActivity.java -> OnCreate(), я назвал ToggleButton таким образом, но он сказал findviewbyId() нулевой объект.

ToggleButton toggle = (ToggleButton)findViewById(R.id.actionbar_gps_toggle); 
toggle.setChecked(true); 

Logcat:

07-21 17:03:25.926 8914-8914/com.rada.radastaff E/AndroidRuntime: FATAL EXCEPTION: main 
    Process: com.rada.radastaff, PID: 8914 
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.rada.radastaff/com.rada.radastaff.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ToggleButton.setChecked(boolean)' on a null object reference 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2316) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2376) 
     at android.app.ActivityThread.access$800(ActivityThread.java:147) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5253) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ToggleButton.setChecked(boolean)' on a null object reference 
     at com.rada.radastaff.MainActivity.onCreate(MainActivity.java:20) 
     at android.app.Activity.performCreate(Activity.java:5975) 
     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269) 
     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2376) 
     at android.app.ActivityThread.access$800(ActivityThread.java:147) 
     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1281) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:135) 
     at android.app.ActivityThread.main(ActivityThread.java:5253) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:372) 

Спасибо заранее.

+1

'но сказал findviewbyId() нулевой object.' могли бы вы опубликовать точную ошибку от LogCat? – Bobby

+0

Я обновил logcat. Благодарю. – TruongHieu

ответ

1

В вашем случае ToggleButton в меню, так что вы должны получить его в onCreateOptionsMenu не onCreate

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    super.onCreateOptionsMenu(menu); 
    getMenuInflater().inflate(R.menu.menu_search, menu); 

    MenuItem item = menu.findItem(R.id.gps_toggle); 
    // get the root layout of your menu item, in your case it is RelativeLayout 
    RelativeLayout rootView = (RelativeLayout)item.getActionView(); 
    // get the ToggleButton in RelativeLayout 
    ToggleButton = (ToggleButton) rootView.findItem(R.id.actionbar_gps_toggle); 

    return true; 
} 
+0

Не работает. Still 'void android.widget.ToggleButton.setChecked (boolean)' в ссылке нулевого объекта ' – TruongHieu

+0

@TruongHieu Я отредактировал свой ответ, пожалуйста, проверьте его –

+0

Я нашел его перед вашим сообщением. Разные вы объявляете это в onCreateOptionsMenu, тогда как мой ответ - onPrepareOptionsMenu. Все равно работает. Спасибо за вашу помощь. – TruongHieu