2017-02-27 43 views
1

我收到以下堆棧跟蹤Android Studio中(v.2.2.3):java.lang.NoSuchMethodError:否isCtrlPressed靜態方法(Landroid /視圖/ KeyEvent的)

E/InputEventSender: Exception dispatching finished signal. 
E/MessageQueue-JNI: Exception in MessageQueue callback: handleReceiveCallback 
E/MessageQueue-JNI: java.lang.NoSuchMethodError: No static method isCtrlPressed(Landroid/view/KeyEvent;)Z in class Landroid/support/v4/view/KeyEventCompat; or its super classes (declaration of 'android.support.v4.view.KeyEventCompat' appears in /data/app/com.app.name-2/base.apk) at android.support.v7.app.AppCompatActivity.dispatchKeyEvent(AppCompatActivity.java:526) 
at android.support.v7.view.WindowCallbackWrapper.dispatchKeyEvent(WindowCallbackWrapper.java:59) 
at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.dispatchKeyEvent(AppCompatDelegateImplBase.java:319) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:2276) 
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:4020) 
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3982) 
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544) 
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3597) 
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3563) 
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3680) 
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3571) 
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3737) 
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544) 
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3597) at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3563) 
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3571) 
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3544) 
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3597) 
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3563) 
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3713)  
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3874) 
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2208) 
at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1849) 
at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1840) 
at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:2185) 
at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141) 
at android.os.MessageQueue.nativePollOnce(Native Method) 
at android.os.MessageQueue.next(MessageQueue.java:143) 
at android.os.Looper.loop(Looper.java:122) 
at android.app.ActivityThread.main(ActivityThread.java:5254) 
at java.lang.reflect.Method.invoke(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:372) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

的android.support。 v4.view包有一個KeyEventCompat類,它有一個文檔化的布爾成員變量isCtrlPressed

由於我的應用程序的視圖覆蓋AppCompatActivity,dispatchKeyEvent()函數靜態調用KeyEventCompat.isCtrlPressed(),但該函數不存在。

我有以下gradle這個設置:

compileSdkVersion = 25 
buildToolsVersion = "25.0.2" 
supportLibVersion = "25.2.0" 
minSdkVersion 14 
targetSdkVersion = 25 

用下面的依賴關係:

compile "com.android.support:appcompat-v7:25.2.0" 
compile "com.android.support:support-compat:25.2.0" 
compile "com.android.support:support-media-compat:25.2.0" 
compile "com.android.support:gridlayout-v7:25.2.0" 
compile "com.android.support:support-core-utils:${rootProject.ext.supportLibVersion}" 
compile "com.android.support:support-core-ui:${rootProject.ext.supportLibVersion}" 
compile "com.android.support:design:${rootProject.ext.supportLibVersion}" 
compile "com.android.support:recyclerview-v7:${rootProject.ext.supportLibVersion}" 
compile 'com.android.support:support-v4:25.2.0' 

這是一個Android的bug?如果是這樣,那麼建議的工作是什麼?也許嘗試編譯使用較低版本的構建工具&支持庫?

+0

將您的代碼發佈到您使用該方法的地方 – arjun

+0

看起來像是在靜態方法中調用** isCtrlPressed()**方法。如果您將** isCtrlPressed()**方法聲明爲** static **,則可以解決此問題,例如:'public static boolean isCtrlPressed(...){...}'。 – DevilsHnd

回答

0

需要指出的是,SO Issue位於here沒有解決我的問題。

我已經申請這一問題作爲一個AOSP錯誤#257553
java.lang.NoSuchMethodError:沒有靜態方法isCtrlPressed(Landroid /視圖/ KeyEvent的)中的Z類Landroid /支撐/ V4 /視圖/ KeyEventCompat;

感謝在Codepath - Migrating To The AppCompat Library上的精彩寫作,我遵循此頁面上記錄的事件的反向版本,以便將AppCompat &支持庫從版本25.2.0降級到版本25.1.0(是的,我下臺了兩個版本,爲了安全起見,如果你願意的話,你可以嘗試下載1個版本)。

於是,我帶着解決問題的步驟是:•

  1. 從SDK管理器中刪除編譯工具25.0.2;
  2. 找到appcompat-v7 SDK文件夾,並刪除整個25.2.0,在我的情況下,25.1.1文件夾,因爲我決定下臺兩個版本;爲PC用戶

    /users/[username]/Library/Android/Sdk/extras/android/m2repository/com/android/support/appcompat-v7 
    

    文件位置::爲Mac OS用戶

    文件位置

    C:\Documents and Settiings<user>\ApPData\Local\Android\Sdk\extras\android\m2repository\com\android\support\appcompat-v7 
    
  3. 這裏面相同文件夾(在上述步驟2中所定義的位置)編輯行家的元數據。 xml文件並刪除其中包含的兩行:

    <version>25.2.0</version> 
    <version>25.1.1</version> 
    
  4. 在app/build.gradle中降級構建工具和AppCompat庫:

    buildToolsVersion '25.0.0' 
    supportLibVersion '25.1.0' 
    
  5. 清理項目並重建。

UPDATE

應當指出的是,上述解決方案爲那些特定的庫版本,並建立變種。

只要我更新了下列生成變量,又回到原來的錯誤:

buildTooleVersion '25.0.2' 
supportLibVersion '25.3.0' 

,根據此構建變量解決了這個問題的解決方法很簡單,可以發現here。事實上,我認爲這應該是所有情況下的正確答案,但我沒有在所有構建變體中進行測試。

總結,而不是繼承的android.support.v7.app.AppCompatActivity引用的解決方案,應用程序的活動應該繼承的android.app.Activity類。雖然如果您要在該Activity中創建自定義View,那麼自定義View應該繼承android.support.v7.widget View的子類。通過這樣做,視圖將在Activity類中使用該視圖時繼承支持功能。

相關問題