[解決済み] Android XML Layoutのincludeタグは本当に有効か?
2023-06-16 18:21:20
質問
Android のレイアウトファイルで <include> を使用すると、属性を上書きすることができません。バグを検索したところ、Declined 課題2863 :
includeタグが壊れています(レイアウトパラメータのオーバーライドが機能しません)。
Romain はこれがテスト・スイートと彼の例で動作することを示しているので、私は何か間違ったことをしているに違いありません。
私のプロジェクトはこのように構成されています。
res/layout
buttons.xml
res/layout-land
receipt.xml
res/layout-port
receipt.xml
buttons.xmlには、このような内容が書かれています。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<Button .../>
<Button .../>
</LinearLayout>
そして、縦長と横長のreceipt.xmlファイルは、以下のような感じです。
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
...
<!-- Overridden attributes never work. Nor do attributes like
the red background, which is specified here. -->
<include
android:id="@+id/buttons_override"
android:background="#ff0000"
android:layout_width="fill_parent"
layout="@layout/buttons"/>
</LinearLayout>
何が足りないのでしょうか?
どのように解決するのですか?
今、問題を発見しました。まず、layout_* 属性しかオーバーライドできないので、背景は機能しません。これは文書化された動作であり、単に私の見落としです。
本当の問題はLayoutInflater.javaで見つかります。
// We try to load the layout params set in the <include /> tag. If
// they don't exist, we will rely on the layout params set in the
// included XML file.
// During a layoutparams generation, a runtime exception is thrown
// if either layout_width or layout_height is missing. We catch
// this exception and set localParams accordingly: true means we
// successfully loaded layout params from the <include /> tag,
// false means we need to rely on the included layout params.
ViewGroup.LayoutParams params = null;
try {
params = group.generateLayoutParams(attrs);
} catch (RuntimeException e) {
params = group.generateLayoutParams(childAttrs);
} finally {
if (params != null) {
view.setLayoutParams(params);
}
}
もし、<include>タグに と layout_width と layout_height の両方を含まない場合、RuntimeException が発生し、ログに記録されることもなく、黙って処理されます。
解決策は、layout_* 属性のいずれかを上書きしたい場合、<include> タグを使用するときに、常に layout_width と layout_height の両方を含めることです。
私の例は、次のように変更する必要があります。
<include
android:id="@+id/buttons_override"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
layout="@layout/buttons"/>
関連
-
[解決済み] 設定ページに移動せずに位置情報サービスをオンにする
-
[解決済み] SDカードからファイルを削除する方法を教えてください。
-
[解決済み] Nexus 4でUSBデバッグモードを見つける方法とオンにする方法
-
[解決済み] CardView layout_width="match_parent "が親のRecyclerViewの幅と一致しない。
-
[解決済み] Androidのソースコードにある@hideの意味とは?
-
[解決済み] データベースでリサイクルビューを使用する
-
[解決済み] Studio 3.4 をアップデートしたら、引数の leftShift() メソッドが見つかりませんでした。
-
[解決済み] 通知をクリックした後にアプリケーションを開く
-
[解決済み] TextView.setTextSizeの挙動がおかしい - テキストビューのテキストサイズを画面ごとに動的に設定する方法
-
[解決済み] edittextのテキストがメールアドレスかどうかを確認するには?
最新
-
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 Webview - キャッシュを完全に削除する
-
[解決済み] プログラム的に電話をかけるには?
-
[解決済み] getApplication()、getApplicationContext()、getBaseContext()、someClass.thisの違いと使い分け。
-
[解決済み] Android ConstraintLayout - あるビューを別のビューの上に配置する
-
[解決済み] 通知をクリックした後にアプリケーションを開く
-
[解決済み] Android: ランドスケープモード用の代替レイアウト xml
-
[解決済み] TextView.setTextSizeの挙動がおかしい - テキストビューのテキストサイズを画面ごとに動的に設定する方法
-
[解決済み] RecyclerViewのアイテムに波及効果を追加する
-
[解決済み] 非推奨のandroid.support.v4.app.ActionBarDrawerToggleの置き換え方法
-
[解決済み] ブルートゥースアプリケーションのテストにアンドロイドエミュレータを使用するには?