Однократная инфляция стиля, который будет использоваться несколько раз - PullRequest
0 голосов
/ 04 августа 2011

Я хочу накачать предмет один раз и использовать его в цикле. В настоящее время у меня есть решение, но, скорее всего, есть лучший способ. Кроме того, программа не будет работать, пока не будет вызван вызов view.removeView, что имеет смысл, но кажется опасным, если я захочу добавить catBtn позже в приложение).

Существующий код:

LinearLayout col1 = (LinearLayout)findViewById(R.id.col1);
for(int i = 0; i < 10; ++i) {
    LinearLayout assets = (LinearLayout)this.getLayoutInflater().inflate(R.layout.assets, null);
    Button btn = (Button)assets.findViewById(R.id.catBtn);//new Button(this);
    assets.removeView(btn);
col1.addView(btn);
}

Существующие layout.assets

<?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:weightSum="1" 
    android:id="@+id/assets">

    <ImageView android:focusable="true" 
        android:id="@+id/thumb" 
        android:background="@drawable/selectable" 
        android:layout_marginBottom="20dip" 
        android:src="@drawable/icon" android:layout_height="140dip" android:layout_width="250dip"/>
    <Button android:id="@+id/catBtn" 
        android:layout_height="wrap_content" 
        android:background="@drawable/selectable" 
        android:text="Cat Button" 
        android:layout_width="120dip" 
        android:textSize="16dip"></Button>
</LinearLayout>

1 Ответ

1 голос
/ 04 августа 2011

Вы можете передать false в качестве последнего параметра в метод inflate

LayoutInflator.from(context).inflate(res, parent, false);

Что приводит к тому, что раздутый вид ни к чему не привязан. Таким образом, вам не нужно ничего удалять. Это избавляет от проблемы assets.removeView (). Но я думаю, что это все еще может быть расточительным.

Похоже, вы просто хотите несколько кнопок:

<Button android:id="@+id/catBtn" 
    android:layout_height="wrap_content" 
    android:background="@drawable/selectable" 
    android:text="Cat Button" 
    android:layout_width="120dip" 
    android:textSize="16dip">

Давайте выделим это в стиль:

<resources>
<declare-stylable android:name="awesome_button">
  <attr android:name="awesomeButtonStyle" android:type="reference"/>
</declare-stylable>

<style android:name="AwesomeButton">
 <item android:name="android:layout_height">wrap_content</item>
 <item android:name="android:background">@drawable/selectable</item>
 <item android:name="android:layout_width">120dp</item>
 <item android:name="android:text">Cat Button</item>
 <item android:name="android:textSize">16sp</item>
</style>

<style android:name="Theme.WithAwesomeButtons" parent="@android:style/Theme">
 <item android:name="awesomeButtonStyle">@style/AwesomeButton</item>
</style>


<resources>

Хорошо, теперь мы катимся со стилем;) (извините, не удержался) Теперь давайте настроим вашу активность внутри AndroidManifest.xml:

<activity android:name=".MyCatBtnActivity"
 ... Whatever else is in your activity
 android:theme="@style/Theme.WithAwesomeButtons"/>

Хорошо, теперь в вашем цикле:

for (int i=0; i<10; i++) {
  // Let's get rid of the LayoutInflator (unless you want to use an xml layout
  // in which case, make awesomeButton.xml and have it just have a button in it
  // with attribute style="?awesomeButtonStyle").
  Button button = new Button(this, null, R.attr.awesome_button.awesomeButtonStyle));
  // Let's tag them with the integer counter so we can id them later
  // You can set id, but there is a slight chance it will not be unique 
  // within the hierarchy. Later on you can either use col1.getChildView(index) to scan
  // and look for these tags (or store them in a local array if col1 holds a lot of views)
  // Then you can also evaluate the tag whenever you are referring to a button from
  // within an OnClickListener or any View listener for that matter.
  button.setTag(Integer.valueOf(i));
  col1.add(button);
}

Я думаю, это то, чего вы пытаетесь достичь.

...