TextView不受seekBar的onProgressChanged影响

时间:2012-12-19 20:39:00

标签: android

我有SeekBar的扩展名:

package com.simplemathgame;

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

public class SeekBarPlus extends SeekBar implements OnSeekBarChangeListener{
    private TextView numberOfDrills;

    public SeekBarPlus(Context context) {
        super(context);
    }

    public SeekBarPlus(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public SeekBarPlus(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }


    public void onStartTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub

    }

    public void onStopTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub

    }

    public void onProgressChanged(SeekBar seekBar, int progress,
            boolean fromUser) {
        // TODO Auto-generated method stub
        Log.w("SeekBarChanged", "change to" + progress);
        numberOfDrills.setText(String.valueOf(progress));
    }

    public void setTextView(TextView textView){
        numberOfDrills = textView;
        Log.w("SeekBar", "text to bar");
    }

}

这是主要的活动代码:

package com.simplemathgame;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import com.simplemathgame.SeekBarPlus;

public class MainActivity extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SeekBarPlus addSeekBar = (SeekBarPlus) findViewById(R.id.add_seek_bar);
        SeekBarPlus subSeekBar = (SeekBarPlus) findViewById(R.id.sub_seek_bar);
        SeekBarPlus mulSeekBar = (SeekBarPlus) findViewById(R.id.mul_seek_bar);
        SeekBarPlus divSeekBar = (SeekBarPlus) findViewById(R.id.div_seek_bar);

        TextView numberOfAddDrills = (TextView) findViewById(R.id.add_drills_number);
        TextView numberOfSubDrills = (TextView) findViewById(R.id.sub_drills_number);
        TextView numberOfMulDrills = (TextView) findViewById(R.id.mul_drills_number);
        TextView numberOfDivDrills = (TextView) findViewById(R.id.div_drills_number);

        addSeekBar.setTextView(numberOfAddDrills);
    subSeekBar.setTextView(numberOfSubDrills);
    mulSeekBar.setTextView(numberOfMulDrills);
    divSeekBar.setTextView(numberOfDivDrills);
    }   
}

我移动进度条后没有任何反应,我有所有需要的元素(TextViews)。

我想:

我希望SeekBarPlus自动监听它的变化,并按照我在onProgressChanged方法中的编码做出反应,换句话说,我希望在主活动中没有任何代码的情况下触发onProgressChanged。

截图

enter image description here

3 个答案:

答案 0 :(得分:1)

阅读文档后:

  

SeekBar的客户端可以附加SeekBar.OnSeekBarChangeListener到   被告知用户的行为。

您需要在Seekbar上有一个监听器才能更新。

更新

这是可能的,但您必须创建一个视图来容纳所有内容,然后以这种方式附加它。创建完成后,将自定义视图添加到布局文件中。然后根据需要从自定义视图添加回调。当然,这意味着您添加了听众 IN 您的自定义视图类。

实施例

您的课程中会有这样的内容,确保设置视图的方向:

 package com.blah.my.package
    class MyCustomClass extends LinearLayout{

    CustomSeekbar v1 ...

    CustomSeekbar v2 ...

    CustomSeekbar v3 ...

    CustomSeekbar v4 ...

    CustomSeekbar v5 ...

    CustomSeekbar v6 ...

    ...

    Constructors and methods n' stuff...


    }

一旦你有了这个,那么在你的布局XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <com.blah.my.package.MyCustomClass ... />
    ...
<LinearLayout>

要了解更多信息: http://developer.android.com/training/custom-views/index.html

答案 1 :(得分:1)

最简单的方法是直接在扩展类上实现OnSeekBarChangeListener:

public class SeekBarPlus extends SeekBar implements OnSeekBarChangeListener{

public SeekBarPlus(Context context) {
        super(context);
        setOnSeekBarChangeListener(this);
    }

    public SeekBarPlus(Context context, AttributeSet attrs) {
        super(context, attrs);
        setOnSeekBarChangeListener(this);
    }

    public SeekBarPlus(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setOnSeekBarChangeListener(this);
    }

    ....
}

否则将不会调用任何on *方法。 注意:这应该是composite widget,您不需要传入TextView。

您还需要执行Sergio建议的操作,而不是直接使用int值:numberOfDrills.setText("" + progress);

答案 2 :(得分:0)

那是因为您要将 int 发送给setText(),因此它无效,因为它需要String。将行更改为:

numberOfDrills.setText("" + progress);

或者:

numberOfDrills.setText(String.valueOf(progress));

您可能还想在MainActivity中更改这4行,您将4个TextView设置为相同的搜索栏:

/*addSeekBar.setTextView(numberOfAddDrills);
addSeekBar.setTextView(numberOfSubDrills);
addSeekBar.setTextView(numberOfMulDrills);
addSeekBar.setTextView(numberOfDivDrills);*/

addSeekBar.setTextView(numberOfAddDrills);
subSeekBar.setTextView(numberOfSubDrills);
mulSeekBar.setTextView(numberOfMulDrills);
divSeekBar.setTextView(numberOfDivDrills);