2013-05-02 8 views
8

私のアプリはいくつかのデバイスを除いて大きく動作します。このようなデバイスの1つでは、自分の活動の1つで致命的な例外が発生します。 java.lang.Stringではandroid.text.Spannableにキャストすることはできません... ... android.widget.TextView.setEnabledで(TextView.java:1432)致命的な例外:文字列をSpannableにキャストすることはできません

:エラーが java.lang.ClassCastExceptionがありますここ

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) 

スタックトレースは、エラーを囲むコードの断片です。

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 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コード原因ERROR

private StyledButton mSignIn; 

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

コード行mSignIn.setEnabled(false)がエラーの原因です。私はそれをコメントアウトするか、または両方をifとelse mSignIn.setEnabled(true)を読み取るようにアプリケーションを正常に実行するように置き換えます。

再び。このコードは大部分のデバイスでうまく動作します。

+1

スタックトレース全体を送信してください。 – CommonsWare

+0

スタックトレースを追加しました – user1857437

+1

'setEnabled()'が 'String'や' Spannable'を参照するAndroidのソースコードでは見えません。あなたはおそらくメーカー固有のいくつかのAndroid修正版のバグを乗り越えているでしょう。問題のメーカーに連絡することをお勧めします。 – CommonsWare

答えて

-2

xmlレイアウトファイルで、アンドロイド:imeOptions = "actionDone"が呼び出されたようです。私はそれを削除し、それはもはやクラッシュしなかった。

なぜですか?

1

これは遅いかもしれませんが... SpanしようとしているTextViewのテキストが""に設定されていないことを確認してください。なんらかの理由で空の文字列がspannableではありません。

17

スタイルボタンをスパナブルにしましたか?たとえば、TextViewは次のようになります。

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

+1

これは受け入れられた答えでなければなりません。 – Melvin

関連する問題