Android应用程序中的离散seekbar?

我想创build一个Android应用程序的seekbar,允许用户select-5和5之间的值(它映射到“强烈不同意”和“非常同意”)。 我如何使离散值的seekbar? 还是有更好的UI小部件,我可以用这个?

谢谢。

Solutions Collecting From Web of "Android应用程序中的离散seekbar?"

Seekbar对离散值很有用。 我们对离散数据使用Seekbar,如下所示。 为了显示哪个项目被选中,我们只是改变所选文本视图的字体,使其更大。 你也可以通过改变背景颜色或其他东西来突出显示。 它工作得很好。 您将需要在search栏上调用setMax(11),然后在代码中,您需要适当地在范围(0到11)和(-5到5)之间进行转换。

<LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal"> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal"> <TextView android:text="-5" android:id="@+id/answerNegative5" android:textSize="25sp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:text="-4" android:id="@+id/answerNegative4" android:textSize="25sp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:text="-3" android:id="@+id/answerNegative3" android:textSize="25sp" android:layout_width="wrap_content" android:layout_height="wrap_content" /> ..... </LinearLayout> <SeekBar android:id="@+id/intensitySlider" android:layout_weight="0" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> 

检查这个链接如果你想实现不带第三方库的间隔数离散seekbar然后使用seekbar的风格属性。

 <SeekBar android:id="@+id/sb" android:layout_width="match_parent" android:layout_height="wrap_content" android:max="10" android:thumb="@drawable/ic_location" android:theme="@style/Widget.AppCompat.SeekBar.Discrete" /> 

在这里输入图像说明

我不知道这里有什么问题,你添加一个范围为0-10的seekbar。 然后,如果从所选值减去-5,则可以将这些值映射到-5。

编辑

android:max="10"到xml定义中,并获得一个固定大小的seekbar。

你也许应该考虑添加一个文本视图来表示当前所选值的文本表示forms,比如:非常不赞同。 要更新这个视图,订阅onProgressChanged事件和progress参数会给你select的数字。

 SeekBar s = (SeekBar) findViewById(R.id.SeekBar); s.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { } } 

第一步:设置maxVal为10;

第二步:

 @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { switch(seekBar.getId()) { case R.id.mySeekBar: int prValue = progress - 5; editText.setText(String.valueOf(preValue)); break; } } 

我希望这个代码一定会帮助你。 尝试这个…

  float discrete = 0; float start = 0; float end = 100; float start_pos = 0; int start_position = 0; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); start = -10; //you need to give starting value of SeekBar end = 10; //you need to give end value of SeekBar start_pos = 5; //you need to give starting position value of SeekBar start_position = (int)(((start_pos - start) / (end - start)) * 100); discrete = start_pos; SeekBar seek = (SeekBar) findViewById(R.id.seekBar1); seek.setProgress(start_position); seek.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub Toast.makeText(getBaseContext(), "discrete = " + String.valueOf(discrete), Toast.LENGTH_SHORT).show(); } @Override public void onStartTrackingTouch(SeekBar seekBar) { // TODO Auto-generated method stub } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // TODO Auto-generated method stub // To convert it as discrete value float temp = progress; float dis = end - start; discrete = (start + ((temp / 100) * dis)); } }); }