2013-05-02 15 views
8

Meine App funktioniert sehr gut mit Ausnahme einiger weniger Geräte. Auf einem solchen Gerät bekomme ich bei einer meiner Aktivitäten eine FATALE AUSNAHME. Der Fehler ist java.lang.ClassCastException: java.lang.String kann nicht auf android.text.Spannable gegossen werden ... ... bei android.widget.TextView.setEnabled (TextView.java:1432)Schwerwiegende Ausnahme: String kann nicht in spannbare umgewandelt werden

STACK TRACE

05-02 09:18:19.917: E/AndroidRuntime(20587): FATAL EXCEPTION: main 
05-02 09:18:19.917: E/AndroidRuntime(20587): java.lang.ClassCastException: java.lang.String cannot be cast to android.text.Spannable 
05-02 09:18:19.917: E/AndroidRuntime(20587): at android.widget.TextView.setEnabled(TextView.java:1432) 
05-02 09:18:19.917: E/AndroidRuntime(20587): at com.myapp.android.menu.LoginFragment.checkIfAnyFieldIsEmpty(LoginFragment.java:512) 
05-02 09:18:19.917: E/AndroidRuntime(20587): at com.myapp.android.menu.LoginFragment.onCreateView(LoginFragment.java:183) 
05-02 09:18:19.917: E/AndroidRuntime(20587): at android.support.v4.app.Fragment.performCreateView(Fragment.java:1460) 
05-02 09:18:19.917: E/AndroidRuntime(20587): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:911) 
05-02 09:18:19.917: E/AndroidRuntime(20587): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1088) 
05-02 09:18:19.917: E/AndroidRuntime(20587): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:682) 
05-02 09:18:19.917: E/AndroidRuntime(20587): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1444) 
05-02 09:18:19.917: E/AndroidRuntime(20587): at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:429) 
05-02 09:18:19.917: E/AndroidRuntime(20587): at android.os.Handler.handleCallback(Handler.java:615) 
05-02 09:18:19.917: E/AndroidRuntime(20587): at android.os.Handler.dispatchMessage(Handler.java:92) 
05-02 09:18:19.917: E/AndroidRuntime(20587): at android.os.Looper.loop(Looper.java:137) 
05-02 09:18:19.917: E/AndroidRuntime(20587): at android.app.ActivityThread.main(ActivityThread.java:4962) 
05-02 09:18:19.917: E/AndroidRuntime(20587): at java.lang.reflect.Method.invokeNative(Native Method) 
05-02 09:18:19.917: E/AndroidRuntime(20587): at java.lang.reflect.Method.invoke(Method.java:511) 
05-02 09:18:19.917: E/AndroidRuntime(20587): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1004) 
05-02 09:18:19.917: E/AndroidRuntime(20587): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:771) 
05-02 09:18:19.917: E/AndroidRuntime(20587): at dalvik.system.NativeStart.main(Native Method) 

Hier sind die Code-Schnipsel, den Fehler umgibt.

XML LAYOUT CODE

<com.myapp.android.view.StyledButton 
     android:id="@+id/login_sign_in" 
     style="@style/button_blue" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:background="@drawable/state_list_login" 
     android:textColor="@color/white" 
     android:imeOptions="actionDone" 
     android:padding="10dp" 
     android:text="@string/sign_in" /> 

CUSTOM CODE BUTTON JAVA

public class StyledButton extends Button { 
//variables 
private final String BOLD = "fonts/arial.ttf"; 
private final String NORMAL = "fonts/arial_bold.ttf"; 

private String mCustomFont = null; 

/** 
* Constructor 
* @param context 
*/ 
public StyledButton(Context context) { 
    super(context); 
} 

/** 
* Constructor 
* @param context 
* @param attrs 
*/ 
public StyledButton(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    setCustomAttributes(attrs); 
} 

/** 
* Set custom attributes 
* @param attrs 
*/ 
private void setCustomAttributes(AttributeSet attrs) { 
    TypedArray a=getContext().obtainStyledAttributes(attrs,R.styleable.StyledTextView); 
    mCustomFont = a.getString(R.styleable.StyledTextView_fontAsset); 
    if(mCustomFont != null) { 
     if(!isInEditMode()) { 
      CustomFontManager fontManager = CustomFontManager.getInstance(); 
      super.setTypeface(fontManager.getFont(getContext().getAssets(), mCustomFont)); 
     } 
    } 
    a.recycle(); 
} 

/** 
* Set type face 
*/ 
public void setTypeface(Typeface tf, int style) { 
    CustomFontManager fontManager = CustomFontManager.getInstance(); 
    if(isInEditMode()) { 
     super.setTypeface(tf,style); 
     return; 
    } 
    if(mCustomFont!=null) { 
     super.setTypeface(fontManager.getFont(getContext().getAssets(), mCustomFont)); 
     return; 
    } 
    switch (style) { 
     case Typeface.NORMAL: 
      super.setTypeface(fontManager.getFont(getContext().getAssets(), NORMAL)); 
      break; 
     case Typeface.BOLD: 
      super.setTypeface(fontManager.getFont(getContext().getAssets(), BOLD)); 
      break; 
     default: 
      super.setTypeface(fontManager.getFont(getContext().getAssets(), NORMAL)); 
      break; 
    } 
} 

}

Java-Code fehlerverursachenden

private StyledButton mSignIn; 

    public void checkIfAnyFieldIsEmpty() { 
    if (mEmailEmpty || mPasswordEmpty) { 
     mSignIn.setEnabled(false); 
    } else { 
     mSignIn.setEnabled(true); 
    } 
} 

Die Codezeile mSignIn.setEnabled (false) verursacht den Fehler. Wenn ich es auskommentiere oder es einfach so ersetze, dass sowohl das if als auch sonst mSignIn.setEnabled (true) gelesen wird, läuft die App gut.

Wieder. Der Code funktioniert auf den meisten Geräten einwandfrei.

+1

Bitte buchen Sie den gesamten Stack-Trace. – CommonsWare

+0

Ich habe den Stack-Trace hinzugefügt – user1857437

+1

Ich kann nicht im Quellcode für Android sehen, wo 'setEnabled()' verweist auf 'String' oder' spannable'. Sie stolpern wahrscheinlich über einen Fehler in einer herstellerspezifischen Modifikation von Android. Möglicherweise möchten Sie versuchen, den betreffenden Hersteller zu kontaktieren. – CommonsWare

Antwort

-2

es scheint, als ob ich android: imeOptions = "actionDone" in der XML-Layout-Datei aufgerufen habe. Ich habe das entfernt und es ist nicht mehr abgestürzt.

warum?

1

Dies kann ein aber spät sein, aber ... stellen Sie sicher, dass der Text in der TextView, die Sie versuchen, zu überspannen, nicht als "" festgelegt ist. Aus irgendeinem Grund sind leere Strings nicht spannbar.

17

Haben Sie Ihren Style-Button als spannbar gemacht? Zum Beispiel sollte TextView so aussehen:

TextView.setText ("Hai", TextView.BufferType.SPANNABLE);

+1

Dies sollte die akzeptierte Antwort sein. – Melvin

Verwandte Themen