簡體   English   中英

如何處理android中動態創建的按鈕?

[英]How to handle dynamically created buttons in android?

我是 android 開發的新手,實際上它是我的第一個應用程序。 我在基於 Json 的項目中創建了一個動態布局。 每個對象都包含一個“id”鍵和一些更多的字符串鍵。 我的 json 中的每個對象都應該轉換為 recylcerview 中的 cardview,並且每個 cardview 都有一個按鈕。 我的問題是處理這些動態按鈕。 是否可以確定單擊了哪個按鈕?

View.id是一個整數,如果View是動態生成的,則View.tag設置任意值,但您可以使用的是View.tag 所以你可以將 JSON 中定義的 id 分配給tag ,然后在View被點擊時檢查tag值。 例如

val view1 = View(context)
view1.tag = "id from JSON 1"
view1.setOnClickListener(this::onViewClicked)

val view2 = View(context)
view2.tag = "id from JSON 2"
view2.setOnClickListener(this::onViewClicked)

// ...

private fun onViewClicked(view: View){
    val jsonId = view.tag as? String
    // ...
}

如果您的最小 sdk 級別至少為 17,另一種選擇是使用View.generateViewId()動態生成 id,並將它們與您的 JSON id 一起存儲在Map

使用標簽來區分按鈕。 OnClickListener添加到所有Button並為Button設置不同的 String 標簽。

button.setOnClickListener(this);

添加點擊監聽器

 @Override
  public void onClick(View view){
    String tag = (String)view.getTag();
    if(tag.equals(tag1)){
      // action here 
    }
    //.......
    .....
 }

是的,很直接,你所要做的就是給他們一個唯一的 id 我假設你必須有一個 JSON 數組來創建動態按鈕。

示例代碼

public Button createButton(Context context,String text,int buttonNo){
  //here set the properties
  Button bt = new Button(context);
  bt.setText(text);
  bt.setId(buttonNo);
  bt.setTag(buttonNo);
  bt.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View view){
       //handle the button click, unique id , you can use to differentiate
       int id = view.getId();

    }

  });
  return bt;
}

在 for 循環中調用上述方法或多次調用。 您還可以設置如上所述的標簽來存儲更多信息。

最后,我將 OnClickListener 放在我的 customAdapter 類中的 onBindViewHolder 事件中,如下所示:

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> implements View.OnClickListener {

private Context context;
private List<MyData> my_data;

public CustomAdapter(Context context, List<MyData> my_data) {
    this.context = context;
    this.my_data = my_data;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.card,parent,false);

    return new ViewHolder(itemView);
}

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
        holder.match_date.setText(my_data.get(position).getMatch_date());
        holder.home_name.setText(my_data.get(position).getHome_name());
        holder.away_name.setText(my_data.get(position).getAway_name());

        holder.button.setId(my_data.get(position).getId());
        holder.button.setTag(my_data.get(position).getStringId());
        holder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int intHomeGoals = Integer.parseInt(holder.edtHomeGoals.getText().toString());
                int intAwayGoals = Integer.parseInt(holder.edtAwayGoals.getText().toString());
                if (intHomeGoals == intAwayGoals)
                {
                    Toast.makeText(context, "00000", Toast.LENGTH_SHORT).show();
                }
            }
        });
        Glide.with(context).load(my_data.get(position).getHome_logo()).into(holder.home_logo);
        Glide.with(context).load(my_data.get(position).getAway_logo()).into(holder.away_logo);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM