Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When inflating a layout xml dynamically multiple times, how can I differentiate or identify the Button widgets?

Tags:

android

I am inflating an xml having button, multiple times and i am able to do so perfectly but the problem is when I click the button,i want to show which button is clicked.

   public class InflateExActivity extends Activity implements OnClickListener {
    /** Called when the activity is first created. */

    Button b;


    LinearLayout lLayout;
    LayoutInflater inflater;

    @Override
    public void onCreate(Bundle savedInstanceState) {


        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        for (int i = 0; i < 3; i++) {

             inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
             b = (Button) inflater.inflate(R.layout.buttons, null);
            t = (TextView) inflater.inflate(R.layout.texts, null);


            b.setTag(i); // you'll get 0,1,2 as

            lLayout = (LinearLayout) findViewById(R.id.layout1);
            lLayout.addView(b);

            b.setOnClickListener(this);

        }

    }

    public void onClick(View v) {

        }

}
like image 706
Rookie Avatar asked Mar 24 '12 12:03

Rookie


3 Answers

You can use setTag() to each button. Inside the for loop you can assign button.setTag(). And you can use getTag() to retrieve button's tag. After you inflate the layout, add a tag to your button

EDIT2: You should inflate the layout and then look up for your button id. See below:

    public class InflateExActivity extends Activity {
            /** Called when the activity is first created. */
            @Override
            public void onCreate(Bundle savedInstanceState) {
                LinearLayout lLayout;
                final Button b = null;
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                for(int i=0;i<3;i++){
                    final LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflater.inflate(R.layout.buttons, null);
b = v.findViewById(R.id.your_button_id);
    //                 b = (Button) inflater.inflate(R.layout.buttons, null);
                       b.setTag(i); // you'll get 0,1,2 as tags
                    lLayout = (LinearLayout) findViewById(R.id.layout1);
                    lLayout.addView(b);
                    b.setOnClickListener(new OnClickListener() {

                        public void onClick(View v) {
    int specificButton = (Integer)v.getTag();//Changed here.......
                            Toast.makeText(InflateExActivity.this, "Button Clicked"+Integer.toString(specificButton),
                                    Toast.LENGTH_LONG).show();
                        }
                    });
                }
            }  
        }
like image 187
Radu Dan Avatar answered Oct 01 '22 17:10

Radu Dan


items you are adding programmatically, you must have to assign ids to them.

b.setId(1);

EDITED:

public class DynamicLayoutActivity extends Activity implements OnClickListener{
private static final int MY_BUTTON = 9000;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    LinearLayout ll = (LinearLayout)findViewById(R.id.layout1);

    // add button
    Button b = new Button(this);
    b.setText("Button added dynamically!");
    b.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,   LayoutParams.WRAP_CONTENT));
    b.setId(MY_BUTTON);
    b.setOnClickListener(this);
    ll.addView(b);
}
 public void onClick(View v) {
        Toast toast;
        Log.w("ANDROID DYNAMIC VIEWS:", "View Id: " + v.getId());
        switch (v.getId()) {
        case MY_BUTTON:
            toast = Toast.makeText(this, "Clicked on my dynamically added button!", Toast.LENGTH_LONG);
            toast.setGravity(Gravity.TOP, 25, 400);
            toast.show();    
        }
    }

LATEST:

public class InflateExActivity extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        LinearLayout lLayout;
        Button b = null;
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        for(int i=0;i<3;i++){
            final LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
             b = (Button) inflater.inflate(R.layout.buttons, null);
             b.setId(i);
            lLayout = (LinearLayout) findViewById(R.id.layout1);
            lLayout.addView(b);
            b.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                Toast.makeText(InflateExActivity.this, "Button Clicked :"+v.getId(),
                        Toast.LENGTH_LONG).show();
            }
        });
    }
}  
like image 41
Mohammed Azharuddin Shaikh Avatar answered Oct 01 '22 17:10

Mohammed Azharuddin Shaikh


Use the view tag

View.setTag(Object tag);

You can set a string or a complex object like a class to the tag.

like image 23
triggs Avatar answered Oct 01 '22 17:10

triggs