2017-08-08 5 views
1

新しいcompileSdkVersion 26を使用している間は、フラグメント(android.support.v4.app.Fragment)にキャスティングは不要になりました。publicを使用する方法<T extends View> T findViewById(int id);アクティビティAndroidでsdk 26をコンパイルしますか?

:しかし、私は、私は、問題のいくつかの予選の結果を持ってAppCompatActivity

で同じメソッドを取得することはできません。断片内に新しいfindViewById()方法が常に使用され、これに対応しています。

public <T extends android.view.View> T findViewById(int id) { /* compiled code */ } 

B。当初はこれはアクティビティで何かをすることを意味しますが、getActivity().findViewById()を使用すると同じことが行われます。

c。アクティビティが別のクラスから継承されていると思うようになりますが、上に向かってトレースすると、getActivity()AppCompatActivityが見つかりました。両方とも 'FragmentActivity'

dです。アクティビティでfindViewById()メソッドを使用しようとしている間、両方のメソッドが提案されていますが、最終的にはキャストが必要です。

e。私はsimilar question hereを見つけました。 新しいfindViewById()の方法はViewに属しているので、Viewの中にViewというようなものを見つけようとしていますが、このようなものはTextView tv = otherView.findViewById()ですが、まだキャストが必要です。

アクティビティで新しいfindViewById()メソッドを使用するにはどうすればよいですか?

+1

"しかし、私はAppCompatActivityで同じ方法を得ることができません" - あなたは '26.0.0'を使用しています'appcompat-v7'の? ['AppCompatActivity'が' findViewById() '](https://developer.android.com/reference/android/support/v7/app/AppCompatActivity.html#findViewById(int))から' T'を返すように更新されました。 – CommonsWare

+0

@CommonsWare答えがわかりました!私は 'compile 'com.android.support:appcompat-v7:26。+''を使用していました。以前は変更できませんでした。なぜなら、私が '0.0'バージョンで試しても、依存関係がなくなって同期が失敗し、私はこの答えに私を導いてくれます。https://stackoverflow.com/a/45481709/4017501 Androidスタジオの人々がデフォルトで作るのを待つだけです – cutiko

答えて

0

彼はコメントが私を解決に導いてくれたので、私は感謝したい、@ CommonSWare。 this answerに私を導く私は'com.android.support:appcompat-v7:26.+'をコンパイル使用していたと私は0.0バージョンで試す場合でも、依存性が欠落していたので、その後の同期が失敗するので、前にそれを変更することができませんでした

、。

また、@ CommonSWareが指摘するように、AppCompatActivityはライブラリ'com.android.support:appcompat-v7:26.0.0'で提供されています。そのためには、プロジェクトの依存関係にMaven Googleを含める必要があります。url "https://maven.google.com"

これは、Androidスタジオのユーザーがデフォルトで作成するのを待つだけなので、ちょっと残念です。

のGradle:プロジェクト

allprojects { 
    repositories { 
     jcenter() 
     maven { 
      url "https://maven.google.com" 
     } 
    } 
} 

のGradle:アプリ

dependencies { 
    compile 'com.android.support:appcompat-v7:26.0.0' 
} 
0

コードは実際には非常に簡単です、あなたはそれを必要とする任意のクラスに(または共通の基底クラスに)それを自分で追加することができます。

protected <T extends View> T findViewById(@IdRes int id) { 
    return (T) getRootView().findViewById(id); 
} 

あなたも、順番にあなたが欲しいものに名前を変更することができます潜在的な名前の衝突を解決します。

long before Googleが最終的にフレームワークに追加しました。

+0

これは素晴らしい解決策ですが、新しい方法、あなたの助けに感謝 – cutiko

関連する問題