view.getRootView()の本当の意味とテストについて
2022-02-17 17:48:45
view.getRootView()の公式な説明としては 現在のビュー階層で最上位のビューを検索します。 現在のビュー階層で最上位のビューを検索します。
私の理解では、ビューインスタンスが配置されているビュー階層のルートビューを見つけることです。
このview.getRootView()の本当の意味を確認するために、以下のようなテストをしてみました。
activity_main.xml。
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<include
layout="@layout/test_layout"/>
</AbsoluteLayout>
test_layout.xml。
<?xml version="1.0" encoding="utf-8"? >
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content">
<Button
android:id="@+id/testBtn"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
</LinearLayout>
MainActivity.java。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button testBtn = (Button) findViewById(R.id.testBtn);
Log.i("testBtn", testBtn.toString()+" id:"+testBtn.getId());
Log.i("testBtn's RootView",testBtn.getRootView().toString()+" id:"+testBtn.getRootView().getId());
View testView = LayoutInflater.from(this).inflate(R.layout.test_layout, null);
Button testBtn2 = (Button) testView.findViewById(R.id.testBtn);
Log.i("testBtn2", testBtn2.toString()+" id:"+testBtn2.getId());
Log.i("testBtn2's RootView",testBtn2.getRootView().toString()+" id:"+testBtn2.getRootView().getId());
View decorView = getWindow().getDecorView();
View contentView =decorView.findViewById(android.R.id.content);
View mainRootView =((ViewGroup) contentView).getChildAt(0);
Log.i("decorView", decorView.toString()+" id:"+decorView.getId());
Log.i("contentView", contentView.toString()+" id:"+contentView.getId());
Log.i("mainRootView",mainRootView.toString()+" id:"+mainRootView.getId());
}
}
結果を印刷します。
出力された結果から注目すべきは、testBtnとtestBtn2は同じidでも異なるインスタンスであり、異なるビューレベルにあるため、getRootViewで取得したルートビューは、testBtnとtestBtn2が同じidであることを示すことです。 は同じではありません。
最後に、現在のインターフェイスに使われているxmlファイルのルートビューを取得するために
View rootView = ((ViewGroup) (getWindow().getDecorView().findViewById(android.R.id.content))).getChildAt(0);
を取得する。
関連
-
gitlab 設定エラー。リモートリポジトリから読み込めなかったか、ホストキーの検証に失敗しました。
-
AndroidStudio reports Could not resolve all artifacts for configuration ':app:classpath'.
-
プログラム "git.exe "を実行できない場合の正しい解決方法です。CreateProcessエラー=2
-
android E/RecyclerView﹕ アダプタが接続されていないため、レイアウトをスキップする。
-
アンドロイドプロジェクトのパッケージングにgradleを使用する際の問題点
-
アプリはGoogle検索でインデックスされません Androidmanifestのクソみたいな黄色い警告
-
アンドロイドのエリプサイズを使用する
-
android.content.ActivityNotFoundException を解決します。Intent問題を処理するActivityが見つからない
-
新しいAndroidプロジェクトの作成時に、AndroidManifest.xmlファイルが見つからないというプロンプトが表示されます。
-
StrictMode$AndroidBlockGuardPolicy.onNetwork は android.os の下でエラーになります。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
AndroidでAttempt to invoke virtual method... on null object referenceの例外が発生する。
-
AndroidエミュレーターのADBサーバーがACKしない問題
-
Gradle のエラーです。gradle-core.jar (com.android.tools.build:gradle-core:x.x.x) を見つけられませんでした。
-
AndroidがMainActivityが包含クラスでないというエラーを報告する
-
ArrayAdapter は、リソース ID が TextView であることが必要です。
-
Android studioのインストールと問題発生、Emulator: PANIC: AVDのシステムパスが見つかりません。
-
android block certificate validation CertPathValidatorException: 認証パスのトラストアンカーが見つかりません
-
エラー:未宣言の識別子(AS)の使用
-
超シンプルなアンドロイドのタイムディレイ機能
-
Android studio 制約レイアウト ConstraintLayout