2014-05-10 16 views
6

NullPointerException quando premere a lungo sul campo diNullPointerException al ActionBarImplICS (utilizzando app compat) on-premere a lungo

compile 'com.android.support:appcompat-v7:19.1.+' 

XML

<EditText 
    android:id="@+id/field" 
    style="@style/Field" 
    android:textSize="20sp" 
    android:hint="@string/hint" 
    android:nextFocusDown="@+id/other"/> 

Stile

<style name="Field" parent="Theme.AppCompat.Light"> 
    <item name="android:layout_width">fill_parent</item> 
    <item name="android:layout_height">wrap_content</item> 
    <item name="android:textSize">14sp</item> 
    <item name="android:textColor">@color/blue</item> 
    <item name="android:singleLine">true</item> 
    <item name="android:gravity">center_vertical</item> 
    <item name="android:inputType">textCapCharacters|textNoSuggestions</item> 
    <item name="android:imeOptions">actionNext</item> 
    <item name="android:popupBackground">@color/white</item> 
</style> 

LogCat

java.lang.NullPointerException 
    at android.support.v7.app.ActionBarImplICS.getThemedContext(ActionBarImplICS.java:302) 
    at android.support.v7.app.ActionBarImplJB.getThemedContext(ActionBarImplJB.java:20) 
    at android.support.v7.app.ActionBarActivityDelegate.getActionBarThemedContext(ActionBarActivityDelegate.java:208) 
    at android.support.v7.app.ActionBarActivityDelegateICS.onActionModeStarted(ActionBarActivityDelegateICS.java:195) 
    at android.support.v7.app.ActionBarActivityDelegateICS$WindowCallbackWrapper.onActionModeStarted(ActionBarActivityDelegateICS.java:359) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.startActionMode(PhoneWindow.java:2437) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.startActionModeForChild(PhoneWindow.java:2362) 
    at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:665) 
    at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:665) 
    at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:665) 
    at android.view.ViewGroup.startActionModeForChild(ViewGroup.java:665) 
    at android.view.View.startActionMode(View.java:4554) 
    at android.widget.Editor.startSelectionActionMode(Editor.java:1551) 
    at android.widget.Editor.performLongClick(Editor.java:859) 
    at android.widget.TextView.performLongClick(TextView.java:8373) 
    at android.view.View$CheckForLongPress.run(View.java:18441) 
    at android.os.Handler.handleCallback(Handler.java:733) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5102) 
    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) 
+0

L'attività con EditText su di esso ha ActionBar? – erakitin

+0

requestWindowFeature (Window.FEATURE_NO_TITLE); setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); –

risposta

13

ActionBar è null. Questo perché si sta utilizzando un'attività senza un titolo (e quindi anche senza un ActionBar):

requestWindowFeature(Window.FEATURE_NO_TITLE); 

Ci sono due modi per risolvere il problema.

Semplice:
Fai YourActivity NON estende ActionBarActivity ma normale Activity.

Più difficile:
rendere trasparente ActionBar senza titolo, nessuna icona, nessun tasto home, ecc Come fare questo? In primo luogo, definire lo stile ActionBar e nuovo tema che si estende YourAppTheme:

<!-- Your App Theme--> 
<style name="YourAppTheme.Light" parent="@style/Theme.AppCompat.Light"> 
    <...> 
</style> 

<!-- Transparent ActionBar Style --> 
<style name="YourAppTheme.Light.ActionBar.Transparent" parent="@style/Widget.AppCompat.Light.ActionBar"> 
    <item name="android:background">@android:color/transparent</item> 
    <item name="background">@android:color/transparent</item> 
</style> 

<!-- Fullscreen Activity Theme --> 
<style name="YourAppTheme.FullScreen.Light" parent="@style/YourAppTheme.Light"> 
    <item name="android:actionBarStyle">@style/YourAppTheme.Light.ActionBar.Transparent</item> 
    <item name="actionBarStyle">@style/YourAppTheme.Light.ActionBar.Transparent</item> 
    <item name="android:windowIsTranslucent">true</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:backgroundDimEnabled">false</item> 
    <item name="android:windowActionBarOverlay">true</item> 
    <item name="windowActionBarOverlay">true</item> 
</style> 

Successivamente, impostare questo tema per la vostra attività a pieno schermo:

<activity 
    android:name="your.package.name.YourFullscreenActivity" 
    android:label="@string/app_name" 
    android:theme="@style/YourAppTheme.FullScreen.Light" /> 

Infine, aggiungere le righe seguenti al YourFullscreenActivity#onCreate metodo:

getSupportActionBar().setDisplayHomeAsUpEnabled(false); 
getSupportActionBar().setDisplayShowHomeEnabled(false); 
getSupportActionBar().setDisplayShowTitleEnabled(false); 

Spero che possa essere d'aiuto.

+0

Dove posto questo codice? RequestWindowFeature (Window.FEATURE_NO_TITLE); – Kailas

+0

Chiama questo metodo in 'onCreate()' prima di 'super.onCreate()'. – erakitin

+0

grazie. funziona per me :) – Mubbashar

0

La seconda soluzione della risposta di cui sopra funziona, ma fa sì che la riga in alto che sarebbe stata coperta dalla barra di azione sia non modificabile. Impostare la voce di altezza a zero nello stile ActionBar per risolvere questo problema:

<item name="android:height">0dp</item> 
2

Penso di avere una soluzione migliore a questo problema.

Rimuovere requestWindowFeature(Window.FEATURE_NO_TITLE); dall'attività e <item name="android:windowNoTitle">true</item> dal tema attività.

Per il vostro codice di attività aggiungere:

Per onCreate() metodo

View actionBar = getActionBarView(); 
if (actionBar != null) { 
    actionBar.setVisibility(View.GONE); 
} 

Per classe di attività:

public View getActionBarView() { 
    Window window = getWindow(); 
    View v = window.getDecorView(); 
    int resId; 

    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { 
     resId = getResources().getIdentifier(
       "action_bar_container", "id", getPackageName()); 
    } else { 
     resId = Resources.getSystem().getIdentifier(
       "action_bar_container", "id", "android"); 
    } 
    if (resId != 0) { 
     return v.findViewById(resId); 
    } else { 
     return null; 
    } 
} 

@Override 
public void onSupportActionModeStarted(ActionMode mode) { 
    super.onSupportActionModeStarted(mode); 
    View actionBar = getActionBarView(); 
    if (actionBar != null) { 
     actionBar.setVisibility(View.VISIBLE); 
    } 
} 

@Override 
public void onSupportActionModeFinished(ActionMode mode) { 
    super.onSupportActionModeFinished(mode); 
    View actionBar = getActionBarView(); 
    if (actionBar != null) { 
     actionBar.setVisibility(View.GONE); 
    } 
} 

Si tratta di rimuovere barra delle azioni e, allo stesso tempo consente di manipolare il testo in testo di modifica con i pulsanti della modalità di azione.

Acclamazioni

0

penso erakitin è una risposta molto buona, e la tranquillità semplice se si prende il "non si estendono ActionBarActivity, ma nel caso in cui qualcuno ha bisogno o vuole evitare di fare questo cambiamento, me ne vado un'altra risposta e penso che sia anche molto semplice e risolve il problema PERFETTAMENTE

Prova ad aggiungere che questo tema del tuo attività

<item name="android:windowActionBar">false</item> 
0
public class MainActivity extends ActionBarActivity 

Scelgo..:

public class MainActivity extends Activity 
Problemi correlati