3

libary android-support-v7 Pkg.Revision = 23.2.1을 사용하고 있습니다. API 23 용으로 컴파일되고 4.1.2 장치에서 테스트되었습니다. 일부 현대적인 UI 패턴을 구현하는 동안이 문제가 발생했습니다.TextInputLayout.setError()는 예외를 throw합니다. 왜, 어떻게 수정해야합니까?

activity_test.xml 레이아웃

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <android.support.design.widget.TextInputLayout 
     android:id="@+id/textInputLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 

     <EditText 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="TextInputLayout EditText default - error" /> 

    </android.support.design.widget.TextInputLayout> 

    <Button 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:onClick="onClickButtonSetError" 
     android:text="TextInputLayout.setError()" /> 

</LinearLayout> 

ActivityTest.java

public class ActivityTest extends AppCompatActivity 
{ 

    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.activity_test); 
    } 


    public void onClickButtonSetError(View view) { 
     TextInputLayout til = (TextInputLayout)findViewById(R.id.textInputLayout); 
     til.setErrorEnabled(true); 
     til.setError("This is a test error message."); 
    } 
} 

내가 setError() 메소드를 통해 TextInputLayout에 오류를 설정하려고합니다. 저를 많이 말해 주는가있는 IllegalAccessError이다 나는 원인을 알 수 있듯이

10-06 15:47:55.239: E/AndroidRuntime(5780): FATAL EXCEPTION: main 
10-06 15:47:55.239: E/AndroidRuntime(5780): java.lang.IllegalStateException: Could not execute method for android:onClick 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:275) 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at android.view.View.performClick(View.java:4232) 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at android.view.View$PerformClick.run(View.java:17298) 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at android.os.Handler.handleCallback(Handler.java:615) 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at android.os.Handler.dispatchMessage(Handler.java:92) 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at android.os.Looper.loop(Looper.java:137) 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at android.app.ActivityThread.main(ActivityThread.java:4921) 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at java.lang.reflect.Method.invoke(Method.java:511) 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027) 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794) 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at dalvik.system.NativeStart.main(Native Method) 
10-06 15:47:55.239: E/AndroidRuntime(5780): Caused by: java.lang.reflect.InvocationTargetException 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at java.lang.reflect.Method.invoke(Method.java:511) 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270) 
10-06 15:47:55.239: E/AndroidRuntime(5780):  ... 11 more 
10-06 15:47:55.239: E/AndroidRuntime(5780): Caused by: java.lang.IllegalAccessError: tried to access method android.support.v7.widget.AppCompatDrawableManager.getPorterDuffColorFilter:()V from class android.support.design.widget.TextInputLayout 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at android.support.design.widget.TextInputLayout.updateEditTextBackground(TextInputLayout.java:700) 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at android.support.design.widget.TextInputLayout.setError(TextInputLayout.java:592) 
10-06 15:47:55.239: E/AndroidRuntime(5780):  at com.example.testandroidsupportv7.ActivityEditText.onClickButtonSetError(ActivityEditText.java:30) 
10-06 15:47:55.239: E/AndroidRuntime(5780):  ... 14 more 

:이 BTW 나는이 예외를 얻을 버튼 클릭을 통해 이루어집니다. getPorterDuffColorFilter() 메서드에 대한 액세스 수정 자 라이브러리에서 올바르게 설정되지 않은 것 같아요. 그러나 이것은 내 추측입니다. 이 basiclay가 내가 app compat library로 옮긴 이유를 막았 기 때문에 어떻게이 예외를 제거 할 수 있습니까?

답변

1

예상되는 런타임과 다른 버전의 클래스를 거의 확실히 사용하고 있습니다.

Caused by: java.lang.IllegalAccessError: tried to access method android.support.v7.widget.AppCompatDrawableManager.getPorterDuffColorFilter:()V from class android.support.design.widget.TextInputLayout 

당으로 내가 당신을 위해 해결 방법을 발견했다. 아래는 XML에서 textInputLayout에 적용해야하는 스타일입니다.

<style name="TextLabel" parent="TextAppearance.AppCompat"> 
<item name="android:textColorHint">@color/colorLightText</item> 
<item name="android:textSize">14dp</item> 
<item name="colorAccent">@color/colorAccent</item> 
<item name="colorControlNormal">@color/colorMediumText</item> 
<item name="colorControlActivated">@color/colorAccent</item> 
<item name="android:textColorHighlight">@color/COLOR</item> 
<item name="android:textColorLink">@color/COLOR</item> 

는 당신을 위해 일하거나하지 않을 경우 알려줘.

+0

아니, 나던. 같은 예외. 게다가, 나는 변화하는 색깔이 어떻게 문제를 해결할 수 있는지 정말로 볼 수 없다. –

0

그 버그, 참조 : https://code.google.com/p/android/issues/detail?id=78377

그것은 24.0.0에 의해 해결되어야 .. 안드로이드 지원을 업데이트하고 문제가 지속되는지 확인하려고합니다.

안정적인 기본 솔루션이 있으면 임시 해결책을 사용하지 않는 것이 좋습니다.

저는 도움이되기를 바랍니다.

+0

같은 예외는 아닙니다. 그리고 애플 리케이션 지원 23.2.1은 우리의 개발 환경에서 작동 할 수있는 마지막 버전입니다. 지원 라이브러리는 다른 버전을 테스트하기 위해 다운로드 할 수 없습니다. –

0

귀하의 문제가 온 클릭 메소드와 연관된 ..., 난 당신이 다른 시도해야 어쩌면 모르는, 레이아웃을 변경하고 버튼의 온 클릭 속성을 생략과 같은 전체 코드에 의해 활동을 선언하십시오

변화 activity_test.xml에서 버튼

<Button 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/btnSetError" 
    android:text="TextInputLayout.setError()" /> 

ActivityTest.java

public class ActivityTest extends AppCompatActivity 
{ 
    private TextInputLayout txtInput; 
    private Button btnSetError; 
    @Override 
    public void onCreate(Bundle icicle) { 
    super.onCreate(icicle); 
    setContentView(R.layout.activity_test); 

    txtInput = (TextInputLayout) findViewById(R.id.textInputLayout); 
    btnSetError =(Button)findViewById(R.id.btnSetError); 
    btnSetError.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      txtInput.setError("ERROR"); 
     } 
    }); 

}