我编写了一个自定义首选项类,其中包含一个简单的进度条,允许设置诸如音量之类的内容。 偏好效果很好,直到我尝试将其中两个首选项放在我的首选项屏幕中。
当我这样做时,首选项屏幕开始行动起来»两个自定义首选项在我拖动搜索栏时不断切换位置。
任何人都知道为什么会这样吗? 感谢
编辑: 这是自定义首选项的代码
import android.content.Context; import
android.content.SharedPreferences; import android.content.res.TypedArray; import android.graphics.Typeface; import android.preference.Preference; import android.util.AttributeSet; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.SeekBar; import android.widget.SeekBar.OnSeekBarChangeListener; import android.widget.TextView;
public class SeekBarPreference extends Preference implements OnSeekBarChangeListener {
private int mMaximum = 60; private int mInterval = 1; private int mMinimum = 1;
private int mDefault = 50; private TextView monitorBox;
public SeekBarPreference(Context context) { super(context); }
public SeekBarPreference(Context context, AttributeSet attrs) { super(context, attrs); initValues(context, attrs); }
public SeekBarPreference(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initValues(context, attrs); }
private void initValues(Context context, AttributeSet attrs) { TypedArray styledAttributes = context.obtainStyledAttributes(attrs,
R.styleable.SeekBarPreference); mMinimum = styledAttributes.getInt(
R.styleable.SeekBarPreference_barMinValue, 1); mMaximum = styledAttributes.getInt(
R.styleable.SeekBarPreference_barMaxValue, 1); mInterval = styledAttributes.getInt(
R.styleable.SeekBarPreference_barInterval, 1); mDefault = styledAttributes.getInt(
R.styleable.SeekBarPreference_defaultValue, mMaximum); }
@Override protected View onCreateView(ViewGroup parent) {
LinearLayout horizontalLayout = new LinearLayout(getContext()); horizontalLayout.setPadding(15, 5, 10, 5); horizontalLayout.setOrientation(LinearLayout.HORIZONTAL);
LinearLayout verticalLayout = new LinearLayout(getContext()); verticalLayout.setOrientation(LinearLayout.VERTICAL);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT); layoutParams.gravity = Gravity.LEFT; layoutParams.weight = 0.5f;
LinearLayout.LayoutParams settingTitleLayoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT); settingTitleLayoutParams.gravity = Gravity.LEFT; settingTitleLayoutParams.weight =
1.0f;
LinearLayout.LayoutParams seekbarLayoutParams = new LinearLayout.LayoutParams(
80, LinearLayout.LayoutParams.WRAP_CONTENT); seekbarLayoutParams.gravity = Gravity.RIGHT | Gravity.CENTER_VERTICAL;
LinearLayout.LayoutParams selectedAmountLayoutParams = new LinearLayout.LayoutParams(
30, LinearLayout.LayoutParams.WRAP_CONTENT); selectedAmountLayoutParams.gravity = Gravity.CENTER;
TextView titleTextView = new TextView(getContext()); titleTextView.setText(getTitle()); titleTextView.setTextSize(18); titleTextView.setTypeface(Typeface.SANS_SERIF, Typeface.BOLD); titleTextView.setGravity(Gravity.LEFT); titleTextView.setLayoutParams(settingTitleLayoutParams);
TextView summeryTextView = new TextView(getContext()); summeryTextView.setText(getSummary()); summeryTextView.setTextSize(14); summeryTextView.setTypeface(Typeface.SANS_SERIF); summeryTextView.setGravity(Gravity.LEFT); summeryTextView.setLayoutParams(settingTitleLayoutParams);
SeekBar bar = new SeekBar(getContext()); bar.setMax(mMaximum); bar.setProgress(mDefault); bar.setPadding(10, 0, 10, 0); bar.setLayoutParams(seekbarLayoutParams); bar.setOnSeekBarChangeListener(this);
this.monitorBox = new TextView(getContext()); this.monitorBox.setTextSize(12); this.monitorBox.setTypeface(Typeface.MONOSPACE, Typeface.ITALIC); this.monitorBox.setLayoutParams(selectedAmountLayoutParams); this.monitorBox.setPadding(2, 5, 0, 0); this.monitorBox.setText(bar.getProgress()
+ "");
verticalLayout.addView(titleTextView); verticalLayout.addView(summeryTextView); horizontalLayout.addView(verticalLayout, layoutParams); horizontalLayout.addView(bar); horizontalLayout.addView(this.monitorBox); horizontalLayout.setId(android.R.id.widget_frame);
return horizontalLayout; }
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
progress = Math.round(((float) progress) / mInterval) * mInterval; if (progress < mMinimum) { progress = mMinimum; }
if (!callChangeListener(progress)) { seekBar.setProgress((int) this.mDefault); return; }
seekBar.setProgress(progress); this.mDefault = progress; this.monitorBox.setText(progress + ""); updatePreference(progress);
notifyChanged(); }
public void onStartTrackingTouch(SeekBar seekBar) { }
public void onStopTrackingTouch(SeekBar seekBar) { }
@Override protected Object onGetDefaultValue(TypedArray ta, int index) {
int dValue = (int) ta.getInt(index, 5);
return validateValue(dValue); }
@Override protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { int temp = restoreValue ? getPersistedInt(5) : (Integer) defaultValue;
if (!restoreValue) persistInt(temp);
this.mDefault = temp; }
private int validateValue(int value) {
if (value > mMaximum) value = mMaximum; else if (value < 0) value = 0; else if (value % mInterval != 0) value = Math.round(((float) value) / mInterval) * mInterval;
return value; }
private void updatePreference(int newValue) {
SharedPreferences.Editor editor = getEditor(); editor.putInt(getKey(), newValue); editor.commit(); }
}
编辑:我发现使用相同的代码但不同的名称创建第二个类,使用其中一个解决了问题=最糟糕的问题。我不想这样做。有谁有任何想法?
答案 0 :(得分:2)
不是一个真正的解决方案,但将您的布局定义为xml将导致更好,更快的程序。你可以在途中解决你的问题。毋庸置疑,如果你将黑客攻击在一起并没有错,那么就可以进行编程。那说......
您可以尝试将从左向右流动的元素放置在线性视图中并将其水平设置,然后将这些元素堆叠到垂直线性视图中。似乎并排浮动视图导致手机使杠杆来回跳跃。经典的CSS问题(我正在互换浮动和重力)
我认为发生的事情是当您更新搜索栏时,手机正在更新视图并对浮动视图的位置进行不同的计算。如果使用垂直和水平线性视图展示所有内容,它应该可以解决您的问题,并使您的布局更加简单。
答案 1 :(得分:0)
我猜这是一个内嵌首选项,如CheckboxPreference
,而不是像DialogPreference
一样的EditTextPreference
。
如果是这样,请查看您的代码,并确保您不会以某种方式无意中在同一首选项的多个实例之间共享内容。我只完成DialogPreferences
,所以我不太确定如何设置内联首选项。但是,如果您在活动上致电findViewById()
或者想要获取SeekBar
,我可以看到您的两个偏好可能会意外地交织在一起。或者,如果您使用可变静态数据成员,我可能会看到潜在的问题。
除此之外,正如布罗斯先生所说,如果没有看到代码,很难给你建议。