2014-05-10 7 views
6

NullPointerException wenn Lang Presse über FeldNullpointer bei ActionBarImplICS (mit App compat) auf lange drücken

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"/> 

Stil

<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

Hat Aktivität mit EditText darauf ActionBar? – erakitin

+0

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

Antwort

13

Die ActionBar ist null. Das ist, weil Sie eine Aktivität ohne einen Titel verwenden (und damit auch ohne ActionBar):

requestWindowFeature(Window.FEATURE_NO_TITLE); 

Es gibt zwei Möglichkeiten, es zu beheben.

Einfache:
YourActivity Stellen erstreckt NICHT ActionBarActivity aber normal Activity.

Schwieriger:
transparent machen ActionBar ohne Titel, ohne Symbol usw. keine Home-Taste Wie dies zu tun? Zuerst ActionBar Stil und neues Thema definieren, die sich 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> 

Als nächstes setzen dieses Thema auf Ihr Vollbild-Aktivität:

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

Schließlich fügen folgende Zeilen zu YourFullscreenActivity#onCreate Methode:

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

Ich hoffe, es wird helfen.

+0

Wo stelle ich diesen Code? RequestWindowFeature (Window.FEATURE_NO_TITLE); – Kailas

+0

Rufen Sie diese Methode in 'onCreate()' vor 'super.onCreate()' auf. – erakitin

+0

danke dir. es funktioniert für mich :) – Mubbashar

0

Die zweite Lösung zu der obigen Antwort funktioniert, aber bewirkt, dass die oberste Zeile, die von der Aktionsleiste verdeckt worden wäre, nicht geclickt werden kann. Stellen Sie das Höhenelement im Aktionsleistenstil auf Null, um das Problem zu beheben:

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

Ich denke, ich habe eine bessere Lösung für dieses Problem.

Entfernen Sie requestWindowFeature(Window.FEATURE_NO_TITLE); von Aktivität und <item name="android:windowNoTitle">true</item> von Aktivitätsthema.

Um Ihre Aktivität Code hinzu:

Um onCreate() Methode

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

Um Aktivitätsklasse:

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); 
    } 
} 

Dies ist Aktionsleiste entfernen und gleichzeitig ermöglicht es Ihnen, Text zu manipulieren in Text bearbeiten mit Aktionsmodus-Schaltflächen.

Prost

0

Ich denke erakitin eine Antwort ist sehr gut, und ruhig einfach, wenn Sie die „nehmen verlängern NICHT ActionBarActivity, aber falls jemand braucht oder will diese Aenderung zu vermeiden, ich verlasse eine andere Antwort was ich denke, ist auch sehr einfach und löst das Problem PERFEKT

Versuchen, diese zu Thema Ihrer Aktivität der

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

Wechsel zu..:

public class MainActivity extends Activity 
Verwandte Themen