【问题标题】:Android: many equal Buttons, onclick doesn't work for certainAndroid:许多相同的按钮,onclick 肯定不起作用
【发布时间】:2012-12-11 10:36:42
【问题描述】:

LinearLayout 中有七个相等的 Buttons

<?xml version="1.0" encoding="utf-8"?>    
   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:weightSum="7" >

<Button
    android:id="@+id/btn_mon"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_weight="1"
    android:background="@color/white"        
    android:text="0" />

<Button
    android:id="@+id/btn_tus"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:text="0"
    android:background="@color/white"        
    android:layout_weight="1"/>
<Button
    android:id="@+id/btn_wen"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:text="0"
    android:background="@color/white"        
    android:layout_weight="1"/>
<Button
    android:id="@+id/btn_thu"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:text="0"
    android:background="@color/white"        
    android:layout_weight="1"/>
<Button
    android:id="@+id/btn_fri"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:text="0"
    android:background="@color/white"        
    android:layout_weight="1"/>
<Button
    android:id="@+id/btn_sat"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:text="0"
    android:background="@color/white"        
    android:layout_weight="1"/>
<Button
    android:id="@+id/btn_sun"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:text="0"
    android:background="@color/white"       
    android:layout_weight="1"/>
</LinearLayout>

他们的 OnClickListener 也相等(并且也在初始化):

if (convertView == null) {
                LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(R.layout.calendar_row, null);
            }

final Button btn_mon = (Button)convertView.findViewById(R.id.btn_mon);
final Button btn_tus = (Button)convertView.findViewById(R.id.btn_tus);
final Button btn_wen = (Button)convertView.findViewById(R.id.btn_wen);
final Button btn_thu = (Button)convertView.findViewById(R.id.btn_thu);
final Button btn_fri = (Button)convertView.findViewById(R.id.btn_fri);
final Button btn_sat = (Button)convertView.findViewById(R.id.btn_sat);
final Button btn_sun = (Button)convertView.findViewById(R.id.btn_sun);

        btn_mon.setOnClickListener(new View.OnClickListener() {             
            public void onClick(View v) { onCalBtnClick(btn_mon, weekdays.get(0).data); }});
        btn_tus.setOnClickListener(new View.OnClickListener() {             
            public void onClick(View v) { onCalBtnClick(btn_tus, weekdays.get(1).data); }});
        btn_wen.setOnClickListener(new View.OnClickListener() {             
            public void onClick(View v) { onCalBtnClick(btn_wen, weekdays.get(2).data); }});
        btn_thu.setOnClickListener(new View.OnClickListener() {             
            public void onClick(View v) { onCalBtnClick(btn_thu, weekdays.get(3).data); }});
        btn_fri.setOnClickListener(new View.OnClickListener() {             
            public void onClick(View v) { onCalBtnClick(btn_fri, weekdays.get(4).data); }});
        btn_sat.setOnClickListener(new View.OnClickListener() {             
            public void onClick(View v) { onCalBtnClick(btn_sat, weekdays.get(5).data); }});
        btn_sun.setOnClickListener(new View.OnClickListener() {             
            public void onClick(View v) { onCalBtnClick(btn_sun, weekdays.get(6).data); }});

onCalBtnClick 方法:

private void onCalBtnClick(Button btn, int day){            

            Log.d("debug", String.valueOf(day));
            btn.setTextColor(mContext.getResources().getColor(R.color.orange));
            //selectedYear, month are global
            Intent intent = new Intent();
            intent.putExtra("year", selectedYear);
            intent.putExtra("month", month);
            intent.putExtra("day", day);
            setResult(RESULT_OK, intent);
            finish();
        }

但是,如果我将Log.d 放入onCalBtnClick 方法(从每个clicklistener 调用),则只有中间三个按钮有效。左侧的两个按钮 (btn_mon, btn_tus) 和右侧的两个按钮 (btn_sat, btn_sun) '不要对用户点击做出反应。中间按钮工作正常。

这是类似的问题Android LinearLayout make button doesn't work,但我的布局文件与答案中的模式相对应,但按钮不起作用

更新

当我删除布局文件中的固定按钮高度和宽度(从 50dp 到 wrap_content)时,所有按钮都开始工作了!

但是,现在看起来并不需要。按钮上的文本之间需要留有空间。

主要问题:为什么?

【问题讨论】:

  • 发布你如何初始化你的 btn_*
  • 显示您的方法 onCalBtnClick,并尝试在 OnClick 中登录
  • 添加了你问的所有内容
  • 您的按钮是否会对标准操作(如悬停、按下等)做出反应?我的意思是按钮图形正在改变?
  • 下一个镜头 - 尝试从按钮中移除固定宽度/高度。

标签: android button onclick android-linearlayout onclicklistener


【解决方案1】:

如果您在布局中使用权重,您就是在告诉它应该填充一些具有某些比例的对象。它与“wrap_content”正好相反。使用权重外部布局定义内部视图的大小,而“wrap_content”表示外部布局大小由内部视图定义。 请决定在这种情况下哪种方法更好 - 删除权重或固定内部视图大小。

【讨论】:

    【解决方案2】:

    将您的线性布局的宽度和高度设置为 FILL_PARENT 。它肯定会工作。

    【讨论】:

      【解决方案3】:

      尝试在您的适配器类之外以及在 weekdays 数组初始化之后为按钮声明所有 setOnClickListener。

      这会解决你的问题。

      或者尝试为所有按钮设置这样的条件:

      if (btn_mon != null && position < weekdays.size()) {
            btn_mon.setOnClickListener(new View.OnClickListener() {             
                  public void onClick(View v) { onCalBtnClick(btn_mon, weekdays.get(0).data); }});
      }
      

      【讨论】:

      • 你注意到没有nullPointException吗?
      • 在处理适配器类时始终检查是安全的。适配器迭代有时起着至关重要的作用。
      猜你喜欢
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 2020-08-17
      相关资源
      最近更新 更多