2013-05-02 16 views
8

La mia app funziona in modo eccezionale con l'eccezione di alcuni dispositivi. Su uno di questi dispositivi, ottengo una FATAL EXCEPTION in una delle mie attività. L'errore è java.lang.ClassCastException: java.lang.String non può essere lanciato a android.text.Spannable ... ... a android.widget.TextView.setEnabled (TextView.java:1432)Eccezione irreversibile: impossibile eseguire il cast della stringa su Spannable

PILA 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) 

Ecco i frammenti di codice che circondano l'errore.

codice del layout XML

<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 BUTTON codice 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; 
    } 
} 

}

codice Java ingenerare errori

La riga del codice mSignIn.setEnabled (false) causa l'errore. Se commento qualcosa o semplicemente lo sostituisco così sia il if che altro leggono mSignIn.setEnabled (true) l'app funziona bene.

Ancora. Il codice funziona correttamente sulla maggior parte dei dispositivi.

+1

Si prega di inviare l'intera traccia dello stack. – CommonsWare

+0

Ho aggiunto la traccia dello stack – user1857437

+1

Non riesco a vedere nel codice sorgente per Android dove 'setEnabled()' fa riferimento a qualsiasi 'String' o' Spannable'. Probabilmente stai inciampando in un errore in alcune modifiche specifiche del produttore ad Android. Potresti provare a contattare il produttore in questione. – CommonsWare

risposta

-2

sembra che stavo chiamando android: imeOptions = "actionDone" nel file di layout xml. L'ho rimosso e non si è più fermato.

perché?

1

Questo può essere un ritardo ma ... assicurarsi che il testo nel TextView che si sta provando a Span non sia impostato come "". Per qualche motivo le stringhe vuote non sono spendibili.

17

Hai reso il tuo pulsante di stile più spanibile? Ad esempio, TextView dovrebbe essere come questo

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

+1

Questa dovrebbe essere la risposta accettata. – Melvin

Problemi correlati