2014-05-10 10 views
6

NullPointerException gdy długo-press nad polemNullPointerException w ActionBarImplICS (przy użyciu aplikacji compat) na długim prasy

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

Style

<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

Czy aktywność z EditText zawiera ActionBar? – erakitin

+0

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

Odpowiedz

13

Pasek akcji ma wartość zerową. Dzieje się tak dlatego, że używasz działania bez tytułu (a więc również bez paska akcji):

requestWindowFeature(Window.FEATURE_NO_TITLE); 

Istnieją dwa sposoby, aby to naprawić.

Proste:
Bądź YourActivity NIE rozciąga ActionBarActivity ale normalny Activity.

Trudniejsze:
Bądź przejrzysty ActionBar bez tytułu, bez ikony, żaden przycisk home itp, jak to zrobić? Po pierwsze, należy zdefiniować styl ActionBar i nowy motyw, który rozciąga 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> 

Następnie ustawić ten motyw do pełnoekranowym działalności:

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

koniec należy dodać następujące linie do YourFullscreenActivity#onCreate metody:

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

Mam nadzieję, że to pomoże.

+0

Gdzie umieścić ten kod? RequestWindowFeature (Window.FEATURE_NO_TITLE); – Kailas

+0

Wywołaj tę metodę do 'onCreate()' przed 'super.onCreate()'. – erakitin

+0

dziękuję. to działa dla mnie :) – Mubbashar

0

Drugie rozwiązanie powyższej odpowiedzi działa, ale powoduje, że górny wiersz, który zostałby zakryty przez pasek akcji, może być niemożliwy do skasowania. Ustaw pozycję wysokości na zero w stylu paska czynności, aby rozwiązać ten problem:

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

Myślę, że mam lepsze rozwiązanie tego problemu.

Usuń requestWindowFeature(Window.FEATURE_NO_TITLE); z działalności i <item name="android:windowNoTitle">true</item> z tematu działalności.

do kodu aktywności dodać:

Aby onCreate() metoda

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

do klasy aktywności:

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

To usunąć pasek akcji, a jednocześnie pozwala na manipulowanie tekstem w edycji tekstu za pomocą przycisków trybu działania.

Cheers

0

myślę erakitin jest bardzo dobra odpowiedź, a cichy proste, jeśli wziąć „nie rozciągają ActionBarActivity, ale w przypadku ktoś potrzebuje lub chce uniknąć tej zmiany, wyjeżdżam kolejną odpowiedź co moim zdaniem jest również bardzo proste i rozwiązuje problem DOSKONALE

spróbuj dodać do tego tematu swoją aktywność w

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

Zmiana..:

public class MainActivity extends Activity 
Powiązane problemy