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を渡す必要はありません。

intまた、Sergioが提案したことを実行し、値を直接使用しないようにする必要があります。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

これは、 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);
于 2012-12-19T20:43:17.547 に答える