0

我有 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。

截屏

在此处输入图像描述

4

3 回答 3

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* 方法。注意:这确实应该是一个复合小部件,您不需要传入 TextView。

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

于 2012-12-19T22:00:11.977 回答
1

阅读文档后:

SeekBar 的客户端可以附加一个 SeekBar.OnSeekBarChangeListener 来通知用户的操作。

您需要在 Seekbar 上安装一个侦听器才能进行更新。

更新

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

例子

你的课堂上会有这样的东西,确保设置视图的方向:

 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

于 2012-12-19T21:15:17.057 回答
0

那是因为您要发送一个intsetText(),所以它不起作用,因为它需要一个String. 将行更改为:

numberOfDrills.setText("" + progress);

或者:

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

您可能也想在 MainActivity 中更改这 4 行,您将 4 个 TextViews 设置为同一个搜索栏:

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

addSeekBar.setTextView(numberOfAddDrills);
subSeekBar.setTextView(numberOfSubDrills);
mulSeekBar.setTextView(numberOfMulDrills);
divSeekBar.setTextView(numberOfDivDrills);
于 2012-12-19T20:43:17.547 回答