سؤال

I have 16 Buttons in my Activity and I have to initialize those inside onCreate(). Is there any way to initialize all buttons in one single line code?(loops etc.) Code should take all buttons R.id. from XML Layout and process....

هل كانت مفيدة؟

المحلول

Let's say you named your button button_0, button_1, .. button_15. You can do:

for (int i = 0; i < 16; i++) {
    int id = getResources().getIdentifier("button_"+i, "id", getPackageName());
    button[i] = (Button) findViewById(id);
}

نصائح أخرى

Well, if all 16 of those buttons are inside one view or layout, then you could do the following.

ArrayList<View> allButtons; 
allButtons = ((LinearLayout) findViewById(R.id.button_container)).getTouchables();

This assumes that your container (in this example a LinearLayout) contains no Touchable that is not a Button.

  1. use Butterknife view injections library
  2. Download Android ButterKnife Zelezny plugin for Android Studio or Intellij IDEA and initialize all your views from current layout by 1 click

For xamarin android :

List<Button>() allButtons = new List<Button>();
for (int i = 1; i < 15; i++)
{
    int id = this.Resources.GetIdentifier("btn" + i.ToString(), "id", this.PackageName);
    Button btn = (Button)FindViewById(id);
    allButtons.Add(btn);

}

This method takes all buttons inside the layout, hope it helps. Easy to implement & you can use it for almost every project, no libraries required.

public List<Button> getAllButtons(ViewGroup layout){
        List<Button> btn = new ArrayList<>();
        for(int i =0; i< layout.getChildCount(); i++){
            View v =layout.getChildAt(i);
            if(v instanceof Button){
                btn.add((Button) v);
            }
        }
        return btn;
    }

Example

List<Button> btn_list = getAllButtons(myRelativeLayout);
Button my_btn = btn_list.get(0);
my_btn.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View view) {
                Log.d("btn_test", "onClick: hello");
     }
});

If you are using Kotlin, and your buttons have ids in the form of button1, button2... button16, you can do something like this:

var btn = ArrayList<Button>(16)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_game_screen)

    for(i in 0 until 16) {
        var id = resources.getIdentifier("button"+(i+1), "id", packageName)
        btn.add(findViewById<View>(id) as Button)
        btn[i].setText("something") //or do whatever now 
    }
}

If you only know the container id or the button ids are all different try this:

Activity(on create method before setContentView)

List<Integer> idButtons= new ArrayList<>();
//container_button is my button container
RelativeLayout containerButton = findViewById(R.id.container_button);
for(int i =0; i < containerButton.getChildCount(); i++){
    View v = containerButton.getChildAt(i);
    if(v instanceof Button){
        idButtons.add(((Button) v).getId());
    }
 }

Layout

<RelativeLayout
    android:id="@+id/container_button"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:layout_weight="1"
    android:layout_marginEnd="0dp">

<Button
    android:id="@+id/buttonac"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@drawable/red_button"
    android:textColor="@android:color/white"
    android:text="AC"
    android:onClick="pulsacion" />

<Button
    android:id="@+id/buttondel"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_toRightOf="@id/buttonac"
    android:layout_alignBottom="@+id/buttonac"
    android:background="@drawable/red_button"
    android:textColor="@android:color/white"
    android:text="DEL"
    android:onClick="pulsacion" />

    [...]
</RelativeLayout>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top