1

比如说我有一个进度条,在 onCreate 活动中我正在设置 onProgressChanged 监听器。

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

             }


        }
    });

我的其他控件(价格框)调整进度,进度条调整价格框,因此它将循环运行。

我可以通过以下方式关闭监听器

sbt.setOnSeekBarChangeListener(null);

但是要重新打开它,我必须为听众重新编写整个部分。有更好的方法吗?多谢

4

4 回答 4

1

当您想要打开时,您的活动可以实现SeekBar.OnSeekBarChangeListener并用于引用侦听器:thisSeekBar

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);
        }
    }
}
于 2013-08-01T20:51:31.340 回答
1

与其内联创建 SeekBar.OnSeekBarChangeListener,不如创建一个 SeekBar.OnSeekBarChangeListener 类型的成员变量。当您希望它打开它时,您可以将变量传递给它。当你想关闭它时,你可以将它传递给 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);
}

您还可以让此对象实现/扩展 OnSeekBarChangeListener,而不是为侦听器保留变量。在这种情况下,启用将传入“this”。

于 2013-08-01T20:46:19.633 回答
0

您可以单独实现它,而不是内联实现侦听器。

private SeekBar.OnSeekBarChangeListener mySeekBarListener = new SeekBar.OnSeekBarChangeListener() {

};

现在每次需要设置监听器时,请使用:

sbt.setOnSeekBarChangeListener(mySeekBarListener);

编辑:

您还可以将侦听器实现分离到另一个类中。然后您可以创建该类的对象并在您的 set 方法中使用它。如果你愿意,另一种做同样事情的方法

于 2013-08-01T20:50:10.227 回答
0

是的。您可以将侦听器存储在实例变量中,然后在代码中的多个位置重用它。

例如,在您的类中创建一个实例变量,如下所示:

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

然后,您可以随时设置侦听器:

// remove listener
sbt.setOnSeekBarChangeListener(null);


// reattach it later
sbt.setOnSeekBarChangeListener(mSeekBarChangeListener);
于 2013-08-01T20:47:32.797 回答