web-dev-qa-db-ja.com

レイヤーリストのドロアブルを変更するには?

いくつかの新しいことを学ぼうとしても、これを理解できません。どんな助けでも大歓迎です。 Googleのドキュメントから正しいこの簡単なコードを考えると:

layers.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:id="@+id/first_image">
      <bitmap Android:src="@drawable/Android_red"
        Android:gravity="center" />
    </item>
    <item Android:id="@+id/second_image" Android:top="10dp" Android:left="10dp">
      <bitmap Android:src="@drawable/Android_green"
        Android:gravity="center" />
    </item>
    <item Android:id="@+id/third_image" Android:top="20dp" Android:left="20dp">
      <bitmap Android:src="@drawable/Android_blue"
        Android:gravity="center" />
    </item>
</layer-list>

そして、main.xml:

<ImageView
    Android:id="@+myImageView"
    Android:layout_height="wrap_content"
    Android:layout_width="wrap_content"
    Android:src="@drawable/layers" />

質問:レイヤーリストのドロアブルの1つをプログラムで参照して、別のドロアブルに変更するにはどうすればよいですか?

ありがとう。

それで、変数myImageにスワップしたい新しいドロウアブルができましたか?さて、それをどのようにレイヤーリストに入れるのですか? findDrawableByLayerIdsetDrawableByLayerIdを使用すると仮定しますが、どのくらい正確ですか?または私はそれを完全に間違っている可能性があります!助けて!

私は何をしようとしていますか?表示されるドロアブルを変更します。たとえば、「Android_purple」という別のドロウアブルがあったとします。上記のレイヤーリストの例で「Android_green」ドロウアブルに切り替えるにはどうすればよいですか?

編集:

これまでの私の限られた知識では、これまでのところ私のコードです(これはnot動作しますが、setDrawableByLayerIdが未定義であるというエラーが発生します):

Resources res = getApplicationContext().getResources();
BitmapDrawable newImage = (BitmapDrawable) res.getDrawable(R.drawable.Android_purple); //Get replacement image, can't use LayerDrawable or get error.   
boolean layer_drawable_changed = (setDrawableByLayerId((R.id.second_image), newImage)); //Set new drawable? Error on this line.
43
ShadowGod

質問:レイヤーリストのドロアブルの1つをプログラムで参照して、別のドロアブルに変更するにはどうすればよいですか?

私がしようとするものは次のとおりです。

ステップ#1:図のように_Android:id_要素に_<item>_属性を設定します ドキュメント内

ステップ#2:getDrawable()の結果を LayerDrawable にキャストします

ステップ#3:Drawableを使用して他の人に影響を与えたくない場合は、mutate()を呼び出します(オプションの場合があります)

ステップ#4:setDrawableByLayerId()を呼び出して、特定のレイヤーIDのDrawableを設定/置換します

52
CommonsWare

ステップ1:ドローアブルフォルダーからレイヤーリストを取得する:(私のものは/res/drawable/digits.xmlで数字と呼ばれていました)

LayerDrawable ld = (LayerDrawable) getResources().getDrawable(R.drawable.digits);

ステップ2:置換イメージに名前を付けます(既にレイヤーリストにあるイメージではありません)

Drawable replace = (Drawable) getResources().getDrawable(R.drawable.replacing_image);

ステップ3:setDrawableByLayerId(int id、Drawable d)メソッドを使用して画像を置き換える

boolean testfactor = ld.setDrawableByLayerId(R.id.first_image, replace);

これは、画像の置換に失敗した場合にfalseを返すブール値を返します

ステップ4:メインImageviewをロードします(基本的に、実際のxmlレイアウトコードのlayer-listのID)

ImageView layoutlist1 = (ImageView)findViewById(R.id.layout_list1);

ステップ5:(再)-更新したLayerDrawableでImageviewを設定します:

layoutlist1.setImageDrawable(ld);

リソース:私はソフトウェアおよびモバイルアプリの開発者です。

この点にたどり着くために、私はStackflow.comのすべてのWebおよび多くの場所を調べました。すべての答えは、このページにすでにあるもののようでした。私は同じことをしようとしていました。それから、「イメージを更新する」というアイデアを考えて、これに至りました。

この 動作する/動作する リストのアイテムの1つにビットマップを置きたいときのために。 replace(setDrawableByLayerId)メソッドを使用するだけです。 IDを置き換える。 ImageViewには多くのメソッドがあります。

これも役に立ちました: LayerList drawable + Bitmapへの変換

51
Kavita