2016-07-21 12 views
1

umgehen Ich habe @Fabrico PH Antwort in this question lesen, um eine Toggle-Taste auf ActionBar zu machen.Kann nicht mit Toggle Button auf Actionbar

Dann habe ich seinen 2. Weg versucht, es zu tun. Es wird in der Aktionsleiste angezeigt, aber ich kann kein Attribut darauf setzen.

Dies ist mein Code:

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> 

-Layout für diesen Menüpunkt:

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> 

In MainActivity.java -> onCreate(), ich habe einen ToggleButton wie folgt aufgerufen, aber es hat findviewbyId() null object angegeben.

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) 

Vielen Dank im Voraus.

+1

'erhalten sollte, aber es sagte findViewById() null object.' Könnten Sie bitte den genauen Fehler von logcat posten? – Bobby

+0

Ich habe den Logcat aktualisiert. Vielen Dank. – TruongHieu

Antwort

1

In Ihrem Fall ToggleButton in Menü ist, so dass Sie es in onCreateOptionsMenu nicht 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

Es funktioniert nicht. Still 'void android.widget.ToggleButton.setChecked (boolean)' auf eine Null-Objekt-Referenz ' – TruongHieu

+0

@TruongHieu Ich habe meine Antwort bearbeiten, überprüfen Sie bitte –

+0

Ich habe es vor Ihrem Beitrag gefunden. Der Unterschied ist, dass Sie es in onCreateOptionsMenu deklarieren, während meine Antwort onPrepareOptionsMenu ist. Es funktioniert sowieso. Danke für Ihre Hilfe. – TruongHieu