3

我正在构建一个 Android 应用程序,在其中我实现了 Activity 的超类型方法,onCheckedChanged(CompoundButton buttonView, boolean isChecked)如下所示:

@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    if (isChecked){
        LinearLayout view = (LinearLayout) findViewById(R.id.some_view);
        Animation anim = expand(view, true);
        view.startAnimation(anim);
    }
    else {
        LinearLayout view = (LinearLayout) findViewById(R.id.some_view);
        Animation anim = expand(view, false);
        view.startAnimation(anim);
    }
}

然后将此方法设置为在 onCreate 方法中侦听 Switch,如下所示:

mySwitch = (Switch) findViewById(R.id.my_switch);
mySwitch.setOnCheckedChangeListener(this);

现在的问题是,我不仅要为 实现此方法some_view,还要为其他几个视图实现此方法。由于我不想多次复制/粘贴此方法而只是更改 some_view 我需要某种方式来传递视图。但是,由于我要覆盖此方法,因此不能简单地向该方法添加参数。由于我为此方法设置了一个侦听器,因此我也不能在调用此方法之前将 id 设置为全局变量。

所以我的问题是:如何将 id 传递给这个方法,这样我就不需要复制/粘贴该方法来为多个视图重用它?

4

3 回答 3

4

实施您自己的OnCheckedChangeListener和满足您需求的两个选项之一:

  1. 使用此侦听器的多个实例。每对一个<Switcher, LinearLayout>
  2. 在切换一个实例时,使用此侦听器的一个实例保存一个数组来LinearLayouts为所有这些设置动画Switcher

这是两个选项的代码。

public class MyOnCheckedChangeListener implements CompoundButton.OnCheckedChangeListener {

    private final View[] mViews;

    public MyOnCheckedChangeListener(View... views) {
        mViews = views
    }

    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        for (View v : mViews) {
            LinearLayout layout = (LinearLayout) v;
            if (isChecked) {
                Animation anim = expand(layout, true);
                layout.startAnimation(anim);
            } else {
                Animation anim = expand(layout, false);
                layout.startAnimation(anim);
            }
        }
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // inflate layout

    // option 1
    mySwitch = (Switch) findViewById(R.id.my_switch);
    mySwitch.setOnCheckedChangeListener(
            new MyOnCheckedChangeListener(findViewById(R.id.some_view)));
    myOtherSwitch = (Switch) findViewById(R.id.my_other_switch);
    myOtherSwitch.setOnCheckedChangeListener(
            new MyOnCheckedChangeListener(findViewById(R.id.some_other_view)));

    // option 2
    mySwitch = (Switch) findViewById(R.id.my_switch);
    mySwitch.setOnCheckedChangeListener(
            new MyOnCheckedChangeListener(new View[]{
                    findViewById(R.id.some_view),
                    findViewById(R.id.some_other_view)
            }));
}
于 2013-10-06T22:26:36.177 回答
1

您可以为每个开关的侦听器实现一个匿名类,而不是您的 ActivityOnCheckedChangeListener直接实现,每个调用以下方法(这与您当前的侦听器相同,但更短并且需要viewId

private void onCheckedChanged(CompoundButton buttonView, boolean isChecked, int viewId) {
    LinearLayout view = (LinearLayout) findViewById(viewId);
    Animation anim = expand(view, isChecked);
    view.startAnimation(anim);
}

然后在开关上:

mySwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() {         
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            super.onCheckedChanged(buttonView, isChecked, some_view_id);
        }
    })
于 2013-10-06T22:20:46.973 回答
1

将所有这些 id 放入一个整数数组中:

int ids[] = {R.id.view1, R.id.view2, . . ...};

将标签设置为CompoundButton buttonView创建时:

buttonView.setTag(ids[index]);

然后,内部方法:

buttonView.getTag();

并且,使用它;)

于 2013-10-06T22:16:14.970 回答