Дискретная панель поиска в приложении Android? - PullRequest
28 голосов
/ 10 апреля 2010

Я хотел бы создать панель поиска для приложения Android, которая позволяет пользователю выбирать значение в диапазоне от -5 до 5 (что соответствует «категорически не согласен» и «полностью согласен»). Как сделать панель поиска с дискретными значениями? или есть лучший виджет пользовательского интерфейса, который я мог бы использовать для этого?

Спасибо.

Ответы [ 6 ]

21 голосов
/ 11 апреля 2010

Seekbar отлично работает для дискретных значений. Мы используем Seekbar для дискретных данных, как показано ниже. Чтобы показать, какой элемент выбран, мы просто изменим шрифт выбранного текстового представления, чтобы он был больше. Вы также можете выделить, изменив цвет фона или что-то. Это работает довольно хорошо. Вы захотите вызвать 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>
16 голосов
/ 17 октября 2016

Проверить эту ссылку Если вы хотите реализовать дискретную панель поиска с количеством пробелов без использования сторонней библиотеки, используйте свойство style для панели поиска.

<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" />

enter image description here

7 голосов
/ 11 апреля 2010

Я не знаю, в чем здесь проблема, вы добавляете панель поиска с диапазоном 0-10. Затем вы можете отобразить эти значения на -5, если вычтете -5 из выбранного значения.

EDIT

добавьте android:max="10" к определению xml, и вы получите панель поиска фиксированного размера.

Возможно, вам следует добавить текстовое представление, чтобы обозначить текстовое представление текущего выбранного значения, например: категорически не согласен. Чтобы обновить это представление, подпишитесь на событие onProgressChanged, а параметр progress предоставит вам выбранный номер.

SeekBar s = (SeekBar) findViewById(R.id.SeekBar);
s.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {

                    @Override
                    public void onProgressChanged(SeekBar seekBar,
                            int progress, boolean fromUser) {
                                    }
}
2 голосов
/ 25 июля 2012

Надеюсь, этот код наверняка вам поможет. Попробуйте это ...

 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));

         }
     });
 }
0 голосов
/ 10 декабря 2018
      <SeekBar
                android:id="@+id/seekbar"
                style="@style/SeekBarWithoutSteps"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginLeft="22dp"
                android:layout_marginRight="22dp"
                android:layout_marginTop="@dimen/margin_10"
                android:max="4"
                android:maxHeight="@dimen/margin_5"
                android:minHeight="@dimen/margin_5"
                android:paddingLeft="@dimen/margin_10"
                android:paddingRight="@dimen/margin_10"
                android:progressBackgroundTint="@color/colorGray"
                android:progressTint="@color/colorGreen"
                android:theme="@style/Widget.AppCompat.SeekBar.Discrete"
                android:thumb="@drawable/filled_green"
                android:thumbOffset="15dp" />
0 голосов
/ 28 февраля 2013

1-й шаг: установите maxVal на 10;

2-й шаг:

@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;
    }
}
...