Android SeekBar颜色栏与进度和拇指不匹配
当屏幕旋转时,我的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
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();
}
}