web-dev-qa-db-ja.com

Androidフレームワークからレイアウトxmlを上書きする

問題

Android名前空間、たとえば R.layout.popup_menu_item_layout (これは コードから参照 として)からレイアウトファイルを上書きしたいので、com.Android.internal.R.layout.popup_menu_item_layout)。overrideと言うことで、フレームワークが所有するレイアウトよりも優先されるプロジェクトでxmlファイルを宣言することを想定しています。

これはレイアウトの例にすぎないので、質問はsdk/platforms/Android-XX/data/res/layoutディレクトリにある各レイアウトに関係することに注意してください。

私が試したこと

tools:override

特定のリソースを上書きする 非文書化tools:overrideタグが利用可能です。例については this の回答を参照してください。これは Design Support Libraryからの値を上書きしますnotfrom Android framework。

tools:override="true"をレイアウトのルートタグに適用しても、効果はありません。


XMLレイアウト参照-refs.xml

this の投稿で説明されているように、refs.xmlディレクトリの/values/ファイルを次の内容で宣言します。

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item type="layout" name="activity_main">@layout/activity_second</item>
</resources>

activity_second.xmlを使用すると、activity_main.xmlが参照されます。 Snackbarのレイアウトを置き換えるためにこの手法を使用することを提案する an answer があります。

これも有効になりません。

質問

Androidパッケージからレイアウトファイルをオーバーライド/置換する正当な方法はありますか?

28
azizbekian

これは古い質問であることはわかっていますが、ライブラリレイアウトを自分のレイアウトで上書きしたかったので、次のようにしました。

問題のレイアウトはdesign_bottom_navigation_item

Refs.xmlに以下を追加しました。

<resources xmlns:tools="http://schemas.Android.com/tools">
    <item name="design_bottom_navigation_item" type="layout" tools:override="true">@layout/bottom_navigation_item</item>
</resources>

これには4つの部分があります。

  • Name:これは、オーバーライドするレイアウトの名前です
  • Type:オーバーライドしようとしているリソースのタイプ(この場合はレイアウト)。
  • tools:override:これは、Android Studioにライブラリレイアウトを独自のものでオーバーライドするように指示する方法です。
  • :これは、代わりに使用するリソースを指定する場所です。

これは、どのリソースタイプでもこの方法で実行できます。

6
Scott Cooper

あなたがやろうとしていることは何ですか?

メニューアイテムがどのように見えるかを置き換えるだけのアイデアであれば、以下を試すことができます:

  1. カスタムMyMenuAdapter extends MenuAdapter
  2. getView メソッドをオーバーライドして、アダプターからビューを返します。
0
Gaurav Vaish

実行時に、アプリケーション自体でSDKをカスタマイズしようとしています。

それだけでは機能しません。

プロジェクト(任意のテクノロジ)でSDKを使用し、いくつかの動作を変更する必要がある場合は、このSDKを調整し、その後、このニュースカスタマイズバージョンでプロジェクトをコンパイルします。
実行時に変更しようとするのは良い考えではありません。
複数の問題に直面します(レトロな互換性、セキュリティトリガー、 [〜#〜]トレブル[〜#〜] 非互換性、依存関係の問題など)

あなたがしたいことをする4つの可能性があります:

  1. 独自のAndroid romを作成し、そこに変更を適用します
  2. タグを使用して、変更が必要なリソースを偽のxmlObjectにコピーします。アプリケーションのonPostCreateの後で、インフレーションを変更できます。この動作を一般化すると、SDKオーバーレイをシミュレートします。
  3. 独自のSDKを作成 :)
  4. マルチレベルのリフレクションですが、安定したバージョンで成功する方法はありません

もちろん、これらのソリューションはいずれもパブリックアプリには適用できません。

0
Antoine Draune