Урок 56. Spinner – выпадающий список

Обсуждение уроков
top
Сообщения: 14
Зарегистрирован: 22 июн 2012, 06:09

Re: Урок 56. Spinner – выпадающий список

Сообщение top » 18 июл 2012, 22:17

НЕ получается сделать Spinner и SimpleCursoradapter.
Делаю разметку для диалога, где находится Spinner
файл разметки dialog_edit.xml

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="290dp"
        android:layout_height="wrap_content"
        android:orientation="vertical"
         >          
          <LinearLayout           
            android:id="@+id/Edit_lv"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:orientation="vertical"
            android:background="@color/Black"
              > 
        <EditText
            android:id="@+id/spinner_edit_text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:ems="10"
            android:layout_gravity="center" 
            android:inputType="number" >

            <requestFocus />
        </EditText>
        
       
        <Spinner 
            android:id="@+id/spinner"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            >
            </Spinner>
      </LinearLayout>
        <LinearLayout
            android:id="@+id/Edit_lh"
            android:layout_height="wrap_content"
            android:layout_width="match_parent"
            android:layout_gravity="center"
            android:layout_marginTop="15dp"
            android:padding="5dp"
            android:background="@color/Black"
            android:orientation="horizontal" 
            >


            
            <Button
                android:id="@+id/edit_ADD"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/edit_textADD"
                 />

            <Button
                android:id="@+id/edit_SUB"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/edit_textSUB"
                />
            
            <Button
                android:id="@+id/edit_Cancel"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/edit_textCancel"
                 />
            
        </LinearLayout>
 </LinearLayout>


Создаю таблицу вида Table (int _id , Text NAME)


Вызываю диалог
...
showDialog(DIALOG);
.....

Код: Выделить всё

 @Override
    protected Dialog onCreateDialog(int id) {
    	Dialog dialog = null;
    	switch (id) {
case DIALOG:

AlertDialog.Builder  AlE = new AlertDialog.Builder(this);
        	AlE.setTitle("Title");
        	LinearLayout view = (LinearLayout)getLayoutInflater().inflate(R.layout.dialog_edit, null); //dialog_edit разметка
        	AlE.setView(view);
        	final EditText edt_spin = (EditText)findViewById(R.id.spinner_edit_text);
        	Button B_ADD = (Button)findViewById(R.id.edit_ADD);
        	Button B_SUB = (Button)findViewById(R.id.edit_SUB);	
        	Button B_Cancel = (Button)findViewById(R.id.edit_Cancel);
// Пока все работает, диалог вызывается, но стоит добавить заполнение через SimpleCursorAdapter  перестает открываться.

Cursor cur = db.query(TABLE, new String[]{"NAME","_id"}, null, null, null, null, null);
        	startManagingCursor(cur);
            String[] spinner_from = new String[]{"NAME","_id"};
            int[] spinner_to =new int[]{android.R.id.text1};
          
        	SimpleCursorAdapter sca_spinner = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item,cur,spinner_from,spinner_to);				 
        	sca_spinner.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        	Spinner spinner = (Spinner)findViewById(R.id.spinner);	
        	spinner.setAdapter(sca_spinner);
        	       	
        	AlE.show();	
        break;	


Пишет java.lang.NullPointerException
и т.д.
Что забыл написать, подскажите, уже третий день найти не могу?
БД открыл db = mdb.getWritableDatabase(); в onCreate

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 56. Spinner – выпадающий список

Сообщение damager82 » 19 июл 2012, 12:42

top писал(а):Пишет java.lang.NullPointerException и т.д.
Напишите в какой именно строке он выдает эту ошибку.

А к коду есть несколько замечаний:

1) Вы используете методы findViewById. Но здесь они вызываются для Activity, а не для диалога, и ищут компоненты в Activity. Чтобы вам найти компоненты диалога, надо вызывать view.findViewById. view вы сформировали ранее в коде. И именно эту view вы используете для диалога.

2) У вас в spinner_from два поля, а в spinner_to - одно.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

top
Сообщения: 14
Зарегистрирован: 22 июн 2012, 06:09

Re: Урок 56. Spinner – выпадающий список

Сообщение top » 19 июл 2012, 14:48

Помогло view.findViewByid.
Не могу понять как определить что для Activity, а что для диалога
Если для Activity пишем EditText = (EditText)findViewById(R.id.edt)
то это сокращенный вариант,а в общем случае надо тоже view или this писать.
Можно поподробнее этот момент.
Кстати, можно ли по генерируемому файлу/res/gen/.../R.java
определить какой элемент к view относится какой к Activity?

2.Без _id не работает. Кстати , на сайте developer.android... тоже _id
прописывают

Аватара пользователя
damager82
Администратор
Сообщения: 1383
Зарегистрирован: 07 янв 2012, 11:32
Контактная информация:

Re: Урок 56. Spinner – выпадающий список

Сообщение damager82 » 19 июл 2012, 16:25

top писал(а):Помогло view.findViewByid.
Не могу понять как определить что для Activity, а что для диалога
Если для Activity пишем EditText = (EditText)findViewById(R.id.edt)
то это сокращенный вариант,а в общем случае надо тоже view или this писать.
Можно поподробнее этот момент.
Есть метод Activity.findViewById - ищет компоненты, которые находятся на Activity.
И есть метод View.findViewById - ищет компоненты среди дочерних для этого View.
Dialog не является частью Activity, поэтому надо получить его View и искать в нем.

top писал(а):Кстати, можно ли по генерируемому файлу/res/gen/.../R.java
определить какой элемент к view относится какой к Activity?
R-константы сквозные. Один и тот же ID может использоваться для абсолютно разных компонентов на абсолютно разных Activity.

top писал(а):2.Без _id не работает. Кстати , на сайте developer.android... тоже _id
прописывают
_id должен быть в курсоре, который вы даете адаптеру. А в массив from вы заносите названия столбцов, значения которых адаптер должен выдать на экран.
Добро пожаловать на форум сайта StartAndroid
ИзображениеИзображение

top
Сообщения: 14
Зарегистрирован: 22 июн 2012, 06:09

Re: Урок 56. Spinner – выпадающий список

Сообщение top » 23 июл 2012, 23:22

А как указать начальную позицию не через SetPosition а через Id элемента.
Например в таблице есть четыре элемента (ID,NAME) (1,A),(2,B),(3,C),(5,D)
id один отсутствует. Надо при появлении Spinner позиция стояла на элементе с ID=5.
Можно поставить spinner.setPosition(3). Но в общем случае надо искать позицию элемента в таблице, а затем присваивать ее.
Нельзя ли сразу как-то по ID ?

Ullis
Сообщения: 11
Зарегистрирован: 03 июл 2012, 12:47

Re: Урок 56. Spinner – выпадающий список

Сообщение Ullis » 09 окт 2012, 11:50

damager82 писал(а):Если например spinner2 зависит от spinner1, то для spinner1 добавляете обработчик spinner1.setOnItemSelectedListener. А в нем прописываете создание/изменение и присвоение адаптера для spinner2.
Здравствуйте.
А подскажите можно-ли создать циклом необходимое количество адаптеров?
Т.е. можно конечно написать:

Код: Выделить всё

ArrayAdapter<CharSequence> adapter_1 = ArrayAdapter.createFromResource(this, R.array ....... 
adapter_1.setDropDownViewResource(R.layout.......
........
ArrayAdapter<CharSequence> adapter_10 = ArrayAdapter.createFromResource(this, R.array ....... 
adapter_10.setDropDownViewResource(R.layout.......
spinner_to = (Spinner) findViewById(R.id.spinner_id);//спиннер который будем менять в зависимости от выбранного пункта в основном спиннере
//потом обработчик в основном спиннеере:
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
    parent.getItemAtPosition(pos); 
    if(pos==1){
        spinner_to.setAdapter(adapter_region_1);
    };
    if(pos==2){
        spinner_to.setAdapter(adapter_region_2);
    }//..... и так далее
Как правильно написать подобную конструкцию? Было бы хорошо если бы работал такой вариант: spinner_to.setAdapter("adapter_region_"+pos);
Прошу прощения за ламерский вопрос. Нужно учить синтаксис.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 56. Spinner – выпадающий список

Сообщение rezak90 » 09 окт 2012, 12:12

Зачем же делать кучу лишних адаптеров если можно сделать один адаптер и грузить в него данные?

Код: Выделить всё

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.ar);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {

    parent.getItemAtPosition(pos);

   switch(pos): {
      case 1:
         adapter = ArrayAdapter.createFromResource(this, R.array.ar1);
         spinner_to.setAdapter(adapter);
      break;
      case 2:
         adapter = ArrayAdapter.createFromResource(this, R.array.ar2);
         spinner_to.setAdapter(adapter);
      break;
}
А ещё можно сделать ещё проще. Все массивы сделать одним многомерным массивом и исходя из позиции pos вытягивать уже нужный массив и тогда код уменьшится до 2-3 строк.
R.id.team
Политика на форуме запрещена

Ullis
Сообщения: 11
Зарегистрирован: 03 июл 2012, 12:47

Re: Урок 56. Spinner – выпадающий список

Сообщение Ullis » 09 окт 2012, 15:46

rezak90 писал(а):Зачем же делать кучу лишних адаптеров если можно сделать один адаптер и грузить в него данные?
О спасибо, не знал, что так можно, хорошая идея, а многомерные массивы как парсить и записывать? Javascript не проблема, а здесь туплю что то :).

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 56. Spinner – выпадающий список

Сообщение rezak90 » 09 окт 2012, 15:52

а ещё лучше списки использовать:

Код: Выделить всё

List<String[]> list = new ArrayList<String[]>();
list.add(getResource().getString(R.array.1));
list.add(getResource().getString(R.array.2));
list.add(getResource().getString(R.array.3));
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.ar);
spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
    parent.getItemAtPosition(pos);
    adapter = ArrayAdapter.createFromResource(this, list.get(pos);
    }
}
R.id.team
Политика на форуме запрещена

Digetix
Сообщения: 117
Зарегистрирован: 12 окт 2012, 15:31

Re: Урок 56. Spinner – выпадающий список

Сообщение Digetix » 20 окт 2012, 23:28

Подскажите пожалуйста, а если не сложно, то и код, как сделать зависимость одного спинера от другого? То есть при выборе в первом менялся выбор в другом

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 56. Spinner – выпадающий список

Сообщение rezak90 » 21 окт 2012, 01:05

Digetix писал(а):Подскажите пожалуйста, а если не сложно, то и код, как сделать зависимость одного спинера от другого? То есть при выборе в первом менялся выбор в другом
просто обрабатываете OnItemSelectedListener в первом спинере.
R.id.team
Политика на форуме запрещена

arreke
Сообщения: 7
Зарегистрирован: 09 окт 2012, 13:51

Re: Урок 56. Spinner – выпадающий список

Сообщение arreke » 21 ноя 2012, 16:58

Имееться стиль кнопки:

Код: Выделить всё

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" >
        <shape>
            <solid
                android:color="#449def" />
            <stroke
                android:width="1dp"
                android:color="#2f6699" />
            <corners
                android:radius="3dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
    <item>
        <shape>
            <gradient
                android:startColor="#449def"
                android:endColor="#2f6699"
                android:angle="270" />
            <stroke
                android:width="1dp"
                android:color="#2f6699" />
            <corners
                android:radius="4dp" />
            <padding
                android:left="10dp"
                android:top="10dp"
                android:right="10dp"
                android:bottom="10dp" />
        </shape>
    </item>
</selector>
Подскажите, пожалуйста, как сделать spinner в похожем стиле?

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 56. Spinner – выпадающий список

Сообщение rezak90 » 21 ноя 2012, 17:15

в бэкграунд спиннера пихаете этот селектор и всё
R.id.team
Политика на форуме запрещена

lek
Сообщения: 3
Зарегистрирован: 02 дек 2012, 23:16

Re: Урок 56. Spinner – выпадающий список

Сообщение lek » 02 дек 2012, 23:25

Пытаюсь скрестить Spinner и Tabs - валится при запуске:

Код: Выделить всё

12-02 20:10:08.864: D/AndroidRuntime(1394): Shutting down VM
12-02 20:10:08.874: W/dalvikvm(1394): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
12-02 20:10:08.884: E/AndroidRuntime(1394): FATAL EXCEPTION: main
12-02 20:10:08.884: E/AndroidRuntime(1394): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.lek.ndapp/com.lek.ndapp.MainActivity}: java.lang.ClassCastException: android.widget.ListView
12-02 20:10:08.884: E/AndroidRuntime(1394): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
12-02 20:10:08.884: E/AndroidRuntime(1394): 	at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
12-02 20:10:08.884: E/AndroidRuntime(1394): 	at android.app.ActivityThread.access$2300(ActivityThread.java:125)
12-02 20:10:08.884: E/AndroidRuntime(1394): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
12-02 20:10:08.884: E/AndroidRuntime(1394): 	at android.os.Handler.dispatchMessage(Handler.java:99)
12-02 20:10:08.884: E/AndroidRuntime(1394): 	at android.os.Looper.loop(Looper.java:123)
12-02 20:10:08.884: E/AndroidRuntime(1394): 	at android.app.ActivityThread.main(ActivityThread.java:4627)
12-02 20:10:08.884: E/AndroidRuntime(1394): 	at java.lang.reflect.Method.invokeNative(Native Method)
12-02 20:10:08.884: E/AndroidRuntime(1394): 	at java.lang.reflect.Method.invoke(Method.java:521)
12-02 20:10:08.884: E/AndroidRuntime(1394): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-02 20:10:08.884: E/AndroidRuntime(1394): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-02 20:10:08.884: E/AndroidRuntime(1394): 	at dalvik.system.NativeStart.main(Native Method)
12-02 20:10:08.884: E/AndroidRuntime(1394): Caused by: java.lang.ClassCastException: android.widget.ListView
12-02 20:10:08.884: E/AndroidRuntime(1394): 	at com.lek.ndapp.MainActivity.onCreate(MainActivity.java:51)
12-02 20:10:08.884: E/AndroidRuntime(1394): 	at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
12-02 20:10:08.884: E/AndroidRuntime(1394): 	at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
12-02 20:10:08.884: E/AndroidRuntime(1394): 	... 11 more
Код следующий:

Код: Выделить всё

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		TabHost tabs = (TabHost) findViewById(android.R.id.tabhost);
		
		tabs.setup();
		
		TabHost.TabSpec spec = tabs.newTabSpec("tag1");
		
		spec.setContent(R.id.tab1);
		spec.setIndicator("Кот");
		tabs.addTab(spec);
		
		spec = tabs.newTabSpec("tag2");
		spec.setContent(R.id.tab2);
		spec.setIndicator("Кошка");
		tabs.addTab(spec);
		
		spec = tabs.newTabSpec("tag3");
		spec.setContent(R.id.tab3);
		spec.setIndicator("Котёнок");
		tabs.addTab(spec);
		
		tabs.setCurrentTab(0);
		
		//
		
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, names);
		
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		
		Spinner s1 = (Spinner) findViewById(R.id.lvTorgPred);
		
		//s1.setAdapter(adapter);
Методом тыка определил, что валится на предпоследней строке Spinner s1 .... Пробовал перед findViewById писать this. и tabs. - всё равно не запускается. Помогите разобраться, как можно сделать спиннер в табсе

Аватара пользователя
Finch
Сообщения: 439
Зарегистрирован: 16 июл 2012, 21:37

Re: Урок 56. Spinner – выпадающий список

Сообщение Finch » 02 дек 2012, 23:49

MainActivity.java 51 строка.
у тебя спинер а передаешь листвью

Код: Выделить всё

Spinner s1 = (Spinner) findViewById(R.id.lvTorgPred);
в xml должно быть что-то типа

Код: Выделить всё

<Spinner
 android:id="@+id/spinner"
 android:layout_width="match_parent"
 android:layout_height="wrap_content">
</Spinner>
CEO of a company R.id.team

lek
Сообщения: 3
Зарегистрирован: 02 дек 2012, 23:16

Re: Урок 56. Spinner – выпадающий список

Сообщение lek » 03 дек 2012, 08:09

Точно, был ListView

Код: Выделить всё

	                    <ListView
	                        android:id="@+id/lvTorgPred"
	                        android:layout_width="match_parent"
	                        android:layout_height="wrap_content" >
	                    </ListView>
Переделал, спасибо

Wa1deMar
Сообщения: 14
Зарегистрирован: 01 авг 2012, 11:19

Re: Урок 56. Spinner – выпадающий список

Сообщение Wa1deMar » 05 дек 2012, 15:31

rezak90 писал(а):в бэкграунд спиннера пихаете этот селектор и всё

а как выставить стиль текста в этом селекторе? не всего списка, а только самой "кнопки".

Код: Выделить всё

<Spinner
                    android:id="@+id/languageSpinner"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content" 
                    android:layout_gravity="right|center"
                    android:background="@drawable/blue_rounded_button"
                    android:padding="10dp"
                    android:textColor="#fff" <!-- игнорит -->
                    android:textSize="10sp" <!-- игнорит -->
                    />

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 56. Spinner – выпадающий список

Сообщение rezak90 » 05 дек 2012, 17:58

попробуйте програмно в обработчике (itemselected или change точно не помню) при выборе нового значения менять ему текст и стиль и т.д. что захотите...
R.id.team
Политика на форуме запрещена

Wa1deMar
Сообщения: 14
Зарегистрирован: 01 авг 2012, 11:19

Re: Урок 56. Spinner – выпадающий список

Сообщение Wa1deMar » 06 дек 2012, 20:03

rezak90 писал(а):попробуйте програмно в обработчике (itemselected или change точно не помню) при выборе нового значения менять ему текст и стиль и т.д. что захотите...

там нет функций для изменения текста(

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 56. Spinner – выпадающий список

Сообщение rezak90 » 06 дек 2012, 20:29

там нет функций для изменения текста(
немного поразило заявление, там приходит вьюшка в обработчике, кастите её к textview и меняете всё что захотите
R.id.team
Политика на форуме запрещена

Ответить