Reputation: 81
say for example I have a progress bar and in onCreate activity I am setting up onProgressChanged listener.
sbt.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
int progressChanged = 0;
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// Toast.makeText(ProductDetailsInfoActivity.this,"seek bar progress:"+progressChanged,
// Toast.LENGTH_SHORT).show();
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromuser) {
//recalcpriceornot=false;
// TODO Auto-generated method stub
//Toast.makeText(ProductDetailsInfoActivity.this, String.valueOf(progress), Toast.LENGTH_SHORT).show();
try {
//if (recalcpriceornot)
{ GetItemPriceCalculation(progress);
recalctotalprice();}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
progressChanged = progress;
if(progress <= 100){
setProgressBarColor(sbt,Color.GREEN);
}else{
setProgressBarColor(sbt,Color.RED);
}
}
});
My other controls (price box) adjust progress and progress bar adjusts price box therefor it will be going in a loop.
i can turn off listener by
sbt.setOnSeekBarChangeListener(null);
but to turn it back on do I have to re-write the whole part for listener. is There a better way of doing it?? thanks a lot
Upvotes: 1
Views: 1970
Reputation: 3735
Your activity can implement SeekBar.OnSeekBarChangeListener
and use this
to reference the listener when you want to turn on the SeekBar
:
import android.app.Activity;
import android.database.SQLException;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
public class MainActivity extends Activity implements OnSeekBarChangeListener {
private int progressChanged = 0;
private SeekBar sbt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
sbt = (SeekBar) findViewById(R.id.seekBar1);
// Turns OFF
sbt.setOnSeekBarChangeListener(null);
// Turns ON
sbt.setOnSeekBarChangeListener(this);
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// Toast.makeText(ProductDetailsInfoActivity.this,"seek bar progress:"+progressChanged,
// Toast.LENGTH_SHORT).show();
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromuser) {
// recalcpriceornot=false;
// TODO Auto-generated method stub
// Toast.makeText(ProductDetailsInfoActivity.this,
// String.valueOf(progress), Toast.LENGTH_SHORT).show();
try {
// if (recalcpriceornot)
{
GetItemPriceCalculation(progress);
recalctotalprice();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
progressChanged = progress;
if (progress <= 100) {
setProgressBarColor(sbt, Color.GREEN);
} else {
setProgressBarColor(sbt, Color.RED);
}
}
}
Upvotes: 1
Reputation: 985
Instead of implementing the listener inline you can implement it separately.
private SeekBar.OnSeekBarChangeListener mySeekBarListener = new SeekBar.OnSeekBarChangeListener() {
};
Now every time you need to set a listener, go with:
sbt.setOnSeekBarChangeListener(mySeekBarListener);
Edit:
You can also separate the listener implementation out into another class. Then you can create an object of that class and use it in your set method. Another way to do the same thing if you'd like
Upvotes: 0
Reputation: 2456
Yes. You can store the listener in an instance variable and then reuse it in multiple places in your code.
For example, create an instance variable in your class like this:
private SeekBar.OnSeekBarChangeListener mSeekBarChangeListener = new SeekBar.OnSeekBarChangeListener() {
int progressChanged = 0;
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// Toast.makeText(ProductDetailsInfoActivity.this,"seek bar progress:"+progressChanged,
// Toast.LENGTH_SHORT).show();
// TODO Auto-generated method stub
}
// other methods, etc
});
Then you can set the listener whenever you feel like it:
// remove listener
sbt.setOnSeekBarChangeListener(null);
// reattach it later
sbt.setOnSeekBarChangeListener(mSeekBarChangeListener);
Upvotes: 0
Reputation: 1112
Instead of inline creating the SeekBar.OnSeekBarChangeListener, create a member variable of type SeekBar.OnSeekBarChangeListener. When you want it to turn it on, you can pass the variable to it. When you want to turn it off, you can pass it the null.
private SeekBar sbt; //Not sure where this gets initialized in your code.
private SeekBar.OnSeekBarChangeListener mListener = new SeekBar.OnSeekBarChangeListener() {
int progressChanged = 0;
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// Toast.makeText(ProductDetailsInfoActivity.this,"seek bar progress:"+progressChanged,
// Toast.LENGTH_SHORT).show();
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromuser) {
//recalcpriceornot=false;
// TODO Auto-generated method stub
//Toast.makeText(ProductDetailsInfoActivity.this, String.valueOf(progress), Toast.LENGTH_SHORT).show();
try {
//if (recalcpriceornot)
{ GetItemPriceCalculation(progress);
recalctotalprice();}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
progressChanged = progress;
if(progress <= 100){
setProgressBarColor(sbt,Color.GREEN);
}else{
setProgressBarColor(sbt,Color.RED);
}
}
});
void enableListener()
{
sbt.setOnSeekBarChangeListener(mListener);
}
void disableListener()
{
sbt.setOnSeekBarChangeListener(null);
}
You can also let this object implement/extends the OnSeekBarChangeListener and not keep a variable to the listener. In which case the enable will pass in "this".
Upvotes: 1