Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SeekBar颜色栏与进度和拇指不匹配_Android_Seekbar_Repaint_Autorotate - Fatal编程技术网

Android SeekBar颜色栏与进度和拇指不匹配

Android SeekBar颜色栏与进度和拇指不匹配,android,seekbar,repaint,autorotate,Android,Seekbar,Repaint,Autorotate,当屏幕旋转时,我的seekbar的彩色条返回到初始值,而拇指保持在正确的位置 基本上是这样的: 它变成这样: public class MyActivity extends Activity { private static final int PROGRESS = 0x1; private ProgressBar mProgress; private int mProgressStatus = 0; private Handler mHandler = new Handler(); p

当屏幕旋转时,我的seekbar的彩色条返回到初始值,而拇指保持在正确的位置

基本上是这样的:

它变成这样:

public class MyActivity extends Activity {
private static final int PROGRESS = 0x1;

private ProgressBar mProgress;
private int mProgressStatus = 0;

private Handler mHandler = new Handler();

protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    setContentView(R.layout.progressbar_activity);

    mProgress = (ProgressBar) findViewById(R.id.progress_bar);

    // Start lengthy operation in a background thread
    new Thread(new Runnable() {
        public void run() {
            while (mProgressStatus < 100) {
                mProgressStatus = doWork();

                // Update the progress bar
                mHandler.post(new Runnable() {
                    public void run() {
                        mProgress.setProgress(mProgressStatus);
                    }
                });               
            }
        }
    }).start();
}
}

请注意,显示
15
TextView
连接到seekbar,并正确显示相同的值,该值在seekbar上的
onCreateView
中更新,使用
getProgress
检索值,因此seekbar内部具有正确的进度,但“忘记”更新其条形图。还请注意,如果稍微移动,该条将正确更新

奇怪的是,我有一个完全相同的seekbar,我在它上执行完全相同的操作(方法调用等),但这个seekbar从来没有这个问题

它们在XML布局文件中的定义方式相同(除了
id

这些搜索栏位于
片段
中,显示在
查看页面
中,以下是片段的大致代码:

public class NewCharacterNameFragment extends Fragment
        implements NumericSeekBar.OnValueChangedListener {

    private static final String LEVEL = "org.my.package.LEVEL";
    private static final String STATS = "org.my.package.STATS";

    private NumericSeekBar levelBar;   // Causing problems
    private NumericSeekBar statsBar;   // Well behaved

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        super.onCreateView(inflater, container, savedInstanceState);

        if (savedInstanceState == null) {  // defaults values to avoid multiple checks later
            savedInstanceState = new Bundle();
            savedInstanceState.putInt(LEVEL, 1);
            savedInstanceState.putInt(STATS, 30);
        }

        View view = inflater.inflate(R.layout.new_character_name_fragment, container,
                                     false);

        levelBar = (NumericSeekBar) view.findViewById(R.id.levelSeekBar);
        statsBar = (NumericSeekBar) view.findViewById(R.id.statPointsSeekBar);

        levelBar.setValue(savedInstanceState.getInt(LEVEL));
        levelBar.setMax(20);
        levelBar.setValueChangedListener(this);

        statsBar.setValue(savedInstanceState.getInt(STATS));
        statsBar.setMax(100);
        statsBar.setValueChangedListener(this);

        // Initialize the text-views with the progress values:
        TextView tView = (TextView) view.findViewById(R.id.statPointsNumTextView);
        tView.setText(Integer.valueOf(statsBar.getValue()).toString());
        tView = (TextView) view.findViewById(R.id.levelNumTextView);
        tView.setText(Integer.valueOf(levelBar.getValue()).toString());

        return view;
    }


    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {

        super.onSaveInstanceState(savedInstanceState);
        savedInstanceState.putInt(LEVEL, levelBar.getValue());
        savedInstanceState.putInt(STATS, statsBar.getValue());
    }


    @Override
    public void onNumericSeekBarValueChanged(NumericSeekBar bar, int value,
                                             boolean fromUser) {
        // Called whenever the seekbar value changes
        if (bar == statsBar) {
            TextView view = (TextView) getView().findViewById(R.id.statPointsNumTextView);
            view.setText(Integer.valueOf(value).toString());
        } else if (bar == levelBar) {
            TextView view = (TextView) getView().findViewById(R.id.levelNumTextView);
            view.setText(Integer.valueOf(value).toString());
        }
    }
}
其中,
NumericSeekBar
是我创建的一个小部件,基本上是一个
LinearLayout
,带有两个递增和递减按钮以及seebar:

public class NumericSeekBar extends LinearLayout
        implements SeekBar.OnSeekBarChangeListener, View.OnClickListener {


    public interface OnValueChangedListener {
        public void onNumericSeekBarValueChanged(NumericSeekBar bar, int value,
                                                 boolean fromUser);
    }

    private Button incButton;
    private Button decButton;
    private SeekBar seekBar;

    private OnValueChangedListener listener = null;

    private int maxValue = 100;
    private int value = 0;


    public NumericSeekBar(Context ctx) {
        super(ctx);
        setOpts();
        setWidgets();
    }

    public NumericSeekBar(Context ctx, AttributeSet attributes) {
        super(ctx, attributes);
        setOpts();
        setWidgets();
    }

    public void setValueChangedListener(OnValueChangedListener listener) {
        this.listener = listener;
    }

    public void setMax(int maxValue) {
        this.maxValue = maxValue;
        seekBar.setMax(maxValue);
    }


    public int getValue() {
        return this.value;  // using seekBar.getProgress() obtains same results
    }

    public boolean setValue(int value) {
        if (value < 0 || value > maxValue) {
            return false;
        }
        this.value = value;
        seekBar.setProgress(value);
        return true;
    }

    @Override
    public void onStopTrackingTouch(SeekBar bar) {
        bar.setSecondaryProgress(bar.getProgress());
    }

    @Override
    public void onStartTrackingTouch(SeekBar bar) {
    }

    @Override
    public void onProgressChanged(SeekBar bar, int value, boolean fromUser) {
        this.value = value;
        if (listener != null ){
            listener.onNumericSeekBarValueChanged(this, value, fromUser);
        }

        if (!fromUser) {
            bar.setSecondaryProgress(0);
        }
    }


    @Override
    public void onClick(View v) {
        // Handle increment/decrement button clicks
        if (v.equals(incButton)) {
            this.setValue(this.getValue() + 1);
        } else if(v.equals(decButton)) {
            this.setValue(this.getValue() - 1);
        }
    }


    private void setOpts() {
        setOrientation(HORIZONTAL);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            setShowDividers(SHOW_DIVIDER_NONE);
        }
    }

    private void setWidgets() {
        incButton = new Button(getContext());
        decButton = new Button(getContext());
        seekBar = new SeekBar(getContext());

        incButton.setText("+");
        incButton.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
        incButton.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                                                   ViewGroup.LayoutParams.WRAP_CONTENT,
                                                   (float) 0.4));
        incButton.setOnClickListener(this);
        decButton.setText("-");
        decButton.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
        decButton.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                                                   ViewGroup.LayoutParams.WRAP_CONTENT,
                                                   (float) 0.4));

        decButton.setOnClickListener(this);

        LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
                                                     ViewGroup.LayoutParams.WRAP_CONTENT,
                                                     (float) 0.2);
        layoutParams.gravity = Gravity.CENTER;

        seekBar.setLayoutParams(layoutParams);

        setMax(this.maxValue);
        setValue(this.value);


        addView(incButton);
        addView(seekBar);
        addView(decButton);

        seekBar.setOnSeekBarChangeListener(this);
    }
}
公共类NumericSeekBar扩展了线性布局
实现SeekBar.onseekbarchaneglistener、View.OnClickListener{
ValueChangedListener上的公共接口{
NumericSeekbarValueChanged上的公共无效(NumericSeekBar条,int值,
布尔值(用户);
}
私人按钮;
私人按钮;
私人SeekBar SeekBar;
私有OnValueChangedListener侦听器=null;
私有整数最大值=100;
私有int值=0;
公共数字seekbar(上下文ctx){
超级(ctx);
setOpts();
setWidgets();
}
公共数字seekbar(上下文ctx、属性集属性){
超级(ctx,属性);
setOpts();
setWidgets();
}
public void setValueChangedListener(OnValueChangedListener侦听器){
this.listener=listener;
}
公共void setMax(int maxValue){
this.maxValue=maxValue;
seekBar.setMax(最大值);
}
public int getValue(){
返回this.value;//使用seekBar.getProgress()可以获得相同的结果
}
公共布尔设置值(int值){
如果(值<0 | |值>最大值){
返回false;
}
这个值=值;
seekBar.setProgress(值);
返回true;
}
@凌驾
TopTrackingTouch上的公共无效(请参见kbar栏){
bar.setSecondaryProgress(bar.getProgress());
}
@凌驾
开始跟踪触摸时的公共无效(请参见kbar栏){
}
@凌驾
public void onProgressChanged(请参见kbar栏、int值、boolean fromUser){
这个值=值;
if(侦听器!=null){
onNumericSeekBarValueChanged(this,value,fromUser);
}
如果(!fromUser){
巴设置秒程序(0);
}
}
@凌驾
公共void onClick(视图v){
//手柄递增/递减按钮点击
如果(v.equals(incButton)){
this.setValue(this.getValue()+1);
}否则如果(v.equals(decButton)){
this.setValue(this.getValue()-1);
}
}
私有void setOpts(){
设置方向(水平);
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.HONEYCOMB){
设置显示分隔符(显示分隔符无);
}
}
私有void setWidgets(){
incButton=新按钮(getContext());
decButton=新按钮(getContext());
seekBar=newseekbar(getContext());
incButton.setText(“+”);
incButton.setTextSize(TypedValue.COMPLEX\u UNIT\u SP,16);
incButton.setLayoutParams(新的LayoutParams(ViewGroup.LayoutParams.MATCH_父级,
ViewGroup.LayoutParams.WRAP_内容,
(浮动)0.4);
incButton.setOnClickListener(此);
decButton.setText(“-”);
decButton.setTextSize(TypedValue.COMPLEX\u UNIT\u SP,16);
decButton.setLayoutParams(新的LayoutParams(ViewGroup.LayoutParams.MATCH_父级,
ViewGroup.LayoutParams.WRAP_内容,
(浮动)0.4);
decButton.setOnClickListener(此);
LayoutParams LayoutParams=新的LayoutParams(ViewGroup.LayoutParams.MATCH_父级,
ViewGroup.LayoutParams.WRAP_内容,
(浮动)0.2);
layoutParams.gravity=gravity.CENTER;
参见kbar.setLayoutParams(layoutParams);
setMax(这个.maxValue);
设置值(此.value);
添加视图(增加按钮);
addView(seekBar);
addView(decButton);
seekBar.setonseekbarchaneglistener(这个);
}
}
这在模拟器和物理设备上都会发生

编辑:我刚刚在安卓4模拟器上测试了我的应用程序,但没有发生这种情况,所以它似乎与2.x有关

EDIT2:我已尝试
使
onCreateView
onStart
onResume
中的条形图无效()
,但问题仍然存在。我还尝试将
levelBar.setValue(levelBar.getValue())
放在
onResume
中,但没有任何更改。 我真的不明白发生了什么事

EDIT3:我添加了另一个片段,其中包含六个条,并且上面代码中只有
levelBar
的行为异常。我想知道这怎么可能。要么是有一些非常奇怪的bug,要么是我做了一些不正确的事情,尽管我看不到哪里(在安卓4.x中都工作得很好)

EDIT4:我的第三次编辑不正确
public class MyActivity extends Activity {
private static final int PROGRESS = 0x1;

private ProgressBar mProgress;
private int mProgressStatus = 0;

private Handler mHandler = new Handler();

protected void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    setContentView(R.layout.progressbar_activity);

    mProgress = (ProgressBar) findViewById(R.id.progress_bar);

    // Start lengthy operation in a background thread
    new Thread(new Runnable() {
        public void run() {
            while (mProgressStatus < 100) {
                mProgressStatus = doWork();

                // Update the progress bar
                mHandler.post(new Runnable() {
                    public void run() {
                        mProgress.setProgress(mProgressStatus);
                    }
                });               
            }
        }
    }).start();
}
}