简体   繁体   中英

Multiple seekbars - set listeneners more efficiently?

I have 12 seekbars in an activity. Each seekbar needs a listener. At the moment I am manually setting a listener for each seekbar, this doesnt seem particularly efficient.

Can anyone recommend a more efficient practice to set the seekbars???

If your SeekBars all require different interaction logic then obviously you will need to provide unique code to each of the objects. However, you can re-use listeners if each SeekBar is doing the same thing. For example:

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);
    }
}

Try something like this:

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);
}

Instead of creating switch in onProgressChanged method you can send variables to SeekBar initiating method.

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;
}

You can just make a reference equality, like this:

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

and call outside:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM