多个搜索栏 - 更有效地设置听众?

Multiple seekbars - set listeneners more efficiently?

我在 activity 中有 12 个搜索栏。每个搜索栏都需要一个监听器。目前我正在为每个搜索栏手动设置一个监听器,这似乎不是特别有效。

任何人都可以推荐一种更有效的方法来设置搜索栏吗???

如果您的 SeekBar 都需要不同的交互逻辑,那么您显然需要为每个对象提供唯一的代码。但是,如果每个 SeekBar 都在做同样的事情,您可以 re-use 个侦听器。例如:

public class SeekBarTest extends Activity{

    private Context myContext;
    public SeekBarTest(Context c){
        myContext = c;
    }

    private void initialize(){

        SeekBar seekbar1 = new SeekBar(myContext);
        SeekBar seekbar2 = new SeekBar(myContext);
        SeekBar seekbar3 = new SeekBar(myContext);

        SeekBar.OnSeekBarChangeListener myListener = new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                //logic
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {
                //logic
            }

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {
                //logic
            }
        };

        seekbar1.setOnSeekBarChangeListener(myListener);
        seekbar2.setOnSeekBarChangeListener(myListener);
        seekbar3.setOnSeekBarChangeListener(myListener);
    }
}

尝试这样的事情:

public class MainActivity extends AppCompatActivity {

SeekBar seekBar1;
SeekBar seekBar2;
SeekBar.OnSeekBarChangeListener mlistener;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    seekBar1 = findViewById(R.id.seekBar_1);
    seekBar2 = findViewById(R.id.seekBar_2);

    mlistener = new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            switch (seekBar.getId()) {
                case R.id.seekBar_1:
                    //do something
                    break;
                case R.id.seekBar_2:
                    //do something else
                    break;
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    }; 

    seekBar1.setOnSeekBarChangeListener(mlistener);
    seekBar2.setOnSeekBarChangeListener(mlistener);
}

您可以将变量发送到 SeekBar 启动方法,而不是在 onProgressChanged 方法中创建开关。

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_options);

    SeekBar volBar = initiateSeekBar(R.id.volume,R.id.volumeValue,0,1,"%");
    SeekBar playSpeedBar = initiateSeekBar(R.id.autoPlay,R.id.autoPlayValue,100, 100,"ms");
}

 private SeekBar initiateSeekBar(int barId, int textId, final int min, final int step, final String unit) {
    SeekBar bar = findViewById(barId);
    final TextView text = findViewById(textId);

    bar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            int value = min + progress * step;
            text.setText(value + " " + unit);
            autoPlayDelayTime = value;
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    });
    return bar;
}

你可以只做一个引用相等,像这样:

override fun onProgressChanged(seekBar: SeekBar?, progress: Int, fromUser: Boolean) {
    seekBar?. let {
        if (this.seekBar1 === it) {
            ...
        }
        if (this.seekBar2 === it) {
            ...
        }}
    ...
}

并在外面打电话:

seekBar1.setOnSeekBarChangeListener(this)
seekBar2.setOnSeekBarChangeListener(this)