我試圖測試Android O Developer Preview的第二階段。 項目創建后,我只是點擊了構建并運行但我沒有任何成功。
Android默認生成的代碼如下:Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
發生編譯錯誤。
Error:(18, 37) error: reference to findViewById is ambiguous both method findViewById(int) in Activity and method findViewById(int) in AppCompatActivity match where T is a type-variable: T extends View declared in method findViewById(int)
幫我! 我該如何解決這個錯誤?
編輯#1
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab); fab.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG) .setAction("Action", null).show(); } }); }
=>編譯錯誤
錯誤:(18,27)錯誤:對findViewById的引用不明確,Activity中的方法findViewById(int)和AppCompatActivity中的方法findViewById(int)匹配,其中T是typesvariables:T extends在方法findViewById(int)中聲明的View
這不是鑄造問題。
我的build.gradle就在這里。
apply plugin: 'com.android.application' android { compileSdkVersion 'android-O' buildToolsVersion "26.0.0-rc2" defaultConfig { applicationId "com.example.app" minSdkVersion 16 targetSdkVersion 'O' versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:26.0.0-beta1' testCompile 'junit:junit:4.12' compile 'com.android.support.constraint:constraint-layout:1.0.2' compile 'com.android.support:design:26.0.0-beta1' }
我嘗試了Android Oreo Developer Preview 2.并使用Android Studio 3.0 Canary版。
你的build.gradle看起來不錯,但是編譯器似乎仍然需要使用supportLib 26來編譯舊的compileSdkVersion (25或更低版本)。
嘗試同步gradle和Build- > Clean Project 。 如果這沒有幫助, File-> Invalidate Cache / Restart應該做的事情……
findViewById的方法簽名隨著API級別25的引入而改變,以支持generics并刪除丑陋的轉換:
新方法簽名:
public T findViewById (int id);
與舊的相比:
public View findViewById(int id);
因此,將您的代碼更改為:
Toolbar toolbar = findViewById(R.id.toolbar);
參考: 查看| Android開發人員
當我的compileSdkVersion為27并且buildToolsVersion不是27時,我遇到了同樣的問題。將它們更改為compileSdkVersion 27 buildToolsVersion“27.0.0”我認為當buildToolsVersion比compileSdkVersion更舊時會發生這種情況。
我相信他們改變了findViewById的方法簽名,這樣你就不再需要強制轉換了。 嘗試將該行代碼更改為
Toolbar toolbar = findViewById(R.id.toolbar);