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

Обсуждение уроков
vlas
Сообщения: 4
Зарегистрирован: 12 июн 2013, 19:38

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

Сообщение vlas » 24 июл 2013, 10:34

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

spinner_style:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:state_window_focused="false" android:state_enabled="true"
        android:drawable="@drawable/spinner_normal" />
    <item
        android:state_window_focused="false" android:state_enabled="false"
        android:drawable="@drawable/spinner_normal" />
    <item
        android:state_pressed="true"
        android:drawable="@drawable/spinner_pressed" />
    <item
        android:state_focused="true" android:state_enabled="true"
        android:drawable="@drawable/spinner_select" />
    <item
        android:state_enabled="true"
        android:drawable="@drawable/spinner_normal" />
    <item
        android:state_focused="true"
        android:drawable="@drawable/spinner_select" />
    <item
        android:drawable="@drawable/spinner_normal" />
</selector>

_________________
<style name="Widget.Spinner" parent="android:Widget">
   	<item name="android:background">@drawable/spinner_style</item>
     	<item name="android:clickable">true</item>
</style>
Подскажите, создал для Spiner`a вот такой стиль, картинки сделал в спец. программе что бы растягивались, все как по учебнику, но когда применяю к Spiner`y этот стиль, Spiner становится толще чем содержимое. В нем находится одна строка а выглядит как две. Толщина такая же как в редакторе, где в нем отображается Item и Sub Item. Как это можно поправить, а то выглядит очень не эстетично.
Вложения
2013-07-24_113332.png
2013-07-24_113332.png (1.32 КБ) 17307 просмотров

buy
Сообщения: 5
Зарегистрирован: 03 авг 2013, 20:18

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

Сообщение buy » 17 авг 2013, 10:59

Спасибо за уроки. У меня не появляется заголовок "Title" выпадающего списка и нету кружков с точками, где отмечается выбранный пункт. Причем метод

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

spinner.setSelection(2);
отрабатывает и выводится соответственный тост. А заголовка в списке нет и кружков... Просто белый список с пунктами как обычный лист.
Раскладки проверил

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

android.R.layout.simple_spinner_item, data
для адаптера и

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

android.R.layout.simple_spinner_dropdown_item
для выпадающего списка.

Думал ошибка в наборе, долго проверял и ничего не нашел, потом сделал полный копипаст урока, но все тоже самое. Да, в остальном работает как надо.

buy
Сообщения: 5
Зарегистрирован: 03 авг 2013, 20:18

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

Сообщение buy » 17 авг 2013, 16:21

Нашел причину. Она как ни странно оказалась в теме оформления. В AndroidManifest.xml вместо

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

<application
        ..................................................
        android:theme="@style/AppTheme" >
Это у меня по умолчанию. Поставил тему как в уроке

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

    <application
        ..................................................
        android:theme="@android:style/Theme.Black" >
Все стало на свои места. Хотя странно что в @style/AppTheme нету похожих элементов, тема светлая, но элементы-то должны присутствовать одинаковые вне зависимости от темы! Тот же заголовок выпадающего списка, пусть он белый, но должен быть. Не знаю почему так, но вопрос решен.

makandrey
Сообщения: 7
Зарегистрирован: 19 авг 2013, 13:36

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

Сообщение makandrey » 05 сен 2013, 10:49

Здравствуйте! Есть выпадающий список (selectingAnswear), содержимое которого берется из ArrayList (answears). Этот ArrayList (answears) изменяется каждый раз при нажатии кнопки, следовательно содержимое выпадающего списка (selectingAnswear) нужно обновить в соответствии с новыми данными. У меня получилось сделать так:

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

public void onClick(View v) {

    // тут изменяем ArrayList answears

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, answears);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    selectingAnswear.setAdapter(adapter);
}
Все работает, но мне кажется этот вариант неудачен с точки зрения экономии памяти, ибо каждый раз создается новый объект ArrayAdapter. Как можно оптимизировать код?

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

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

Сообщение klblk » 05 сен 2013, 15:19

[syntax=java]adapter.clear();
adapter.addAll(answears);
adapter.notifyDataSetChanged();[/syntax]

как-то так наверное

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

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

Сообщение KamiSempai » 05 сен 2013, 16:16

makandrey писал(а):Здравствуйте! Есть выпадающий список (selectingAnswear), содержимое которого берется из ArrayList (answears). Этот ArrayList (answears) изменяется каждый раз при нажатии кнопки, следовательно содержимое выпадающего списка (selectingAnswear) нужно обновить в соответствии с новыми данными. У меня получилось сделать так:

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

public void onClick(View v) {

    // тут изменяем ArrayList answears

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, answears);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    selectingAnswear.setAdapter(adapter);
}
Все работает, но мне кажется этот вариант неудачен с точки зрения экономии памяти, ибо каждый раз создается новый объект ArrayAdapter. Как можно оптимизировать код?
ArrayAdapter хранит ссылку на массив, так что, если answears - это все тот-же массив, тут достаточно вызвать adapter.notifyDataSetChanged().
klblk писал(а):[syntax=java]adapter.clear();
adapter.addAll(answears);
adapter.notifyDataSetChanged();[/syntax]как-то так наверное
Плохой совет. Если так сделать то вместе с адаптером очистится и answears. В результате пустой список.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

makandrey
Сообщения: 7
Зарегистрирован: 19 авг 2013, 13:36

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

Сообщение makandrey » 06 сен 2013, 04:47

Не работает. Ни так:

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

adapter.clear();
adapter.addAll(answears);
adapter.notifyDataSetChanged();
Ни так:

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

adapter.notifyDataSetChanged();

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

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

Сообщение klblk » 06 сен 2013, 05:29

makandrey писал(а):Не работает. Ни так:

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

adapter.clear();
adapter.addAll(answears);
adapter.notifyDataSetChanged();
Ни так:

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

adapter.notifyDataSetChanged();
значит нужно больше кода чтобы понять почему не работает

makandrey
Сообщения: 7
Зарегистрирован: 19 авг 2013, 13:36

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

Сообщение makandrey » 06 сен 2013, 08:51

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

package ru.makaroffas.systemofpsytests;

import java.util.ArrayList;
import org.xmlpull.v1.XmlPullParser;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;

public class TestLanched extends Activity implements OnClickListener{
	TestParser testParser;
	TextView   testName;
	Button     nextQuestion;
	Spinner    selectingAnswear;
	String	   rightAnswear;
	String     question;
	int        userAnswear;
	int 	   countRightAnswear;
	
	ArrayList<String> answears = new ArrayList<String>();
	ArrayAdapter<String> adapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_test_lanched);
		
		testName 	 = (TextView) findViewById(R.id.testName);
		nextQuestion = (Button) findViewById(R.id.nextQuestion);
		selectingAnswear = (Spinner) findViewById(R.id.selectingAnswear);

		//создаем spinner, который будет хранить варианты ответов. сами варианты хранятся в ArrayList "answears"
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, answears);
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		selectingAnswear.setAdapter(adapter);

		XmlPullParser xpp = prepareXpp();
		
		testParser = new TestParser(this, xpp);	

		testName.setText(testParser.getTestName());
		
		nextQuestion.setOnClickListener(this);
		
	}

	XmlPullParser prepareXpp() {
		return getResources().getXml(R.xml.test1);
	}
	
	//getQuestion()     - возвращает строку содержащую следующий вопрос
	//getAnswears()     - возвращает ArrayList с вариантами ответа к этому вопросу
	//getRightAnswear() - возвращает правильный ответ к этому вопросу
	//методы описаны в классе testParser и работоспособны
	//метод также getNextQuestion() протестирован
	public void getNextQuestion(){
		answears.clear();
		question     = testParser.getQuestion();
		answears     = testParser.getAnswears();
		rightAnswear = testParser.getRightAnswear();
		// для тестирования
		Toast.makeText(this, question + answears + rightAnswear, Toast.LENGTH_SHORT).show();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.test_lanched, menu);
		return true;
	}

	@Override
	public void onClick(View v) {
		//получаем новый вопрос, варианты ответа и правильный из них
		getNextQuestion();
		//а подгрузить новые варианты не получается
		adapter.notifyDataSetChanged();
	}
	
}
программа вырубается при щелчке по кнопке

Аватара пользователя
klblk
Сообщения: 1097
Зарегистрирован: 18 окт 2012, 11:17
Откуда: г. Красноярск

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

Сообщение klblk » 06 сен 2013, 10:10

makandrey писал(а):программа вырубается при щелчке по кнопке
[syntax=java]ArrayAdapter<String> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
.....
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, answears);
.....
}[/syntax]

и получилось два разных адаптера... причем один из них null, потому собственно и вылетает видимо. Но на будущее если есть в коде ошибка, то логи её лучше тоже приложить к сообщению.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

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

Сообщение KamiSempai » 06 сен 2013, 14:31

Про качество кода промолчу. Добавлю лишь, что в данном случае, после исправления ошибки с адаптером, будет работать такой вариант:[syntax=java]adapter.clear();
adapter.addAll(answears);[/syntax]
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

makandrey
Сообщения: 7
Зарегистрирован: 19 авг 2013, 13:36

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

Сообщение makandrey » 06 сен 2013, 16:43

klblk писал(а):и получилось два разных адаптера... причем один из них null, потому собственно и вылетает видимо. Но на будущее если есть в коде ошибка, то логи её лучше тоже приложить к сообщению.
Да, после исправления этой ошибки для обновления содержимого spinner, метода notifyDataSetChanged() достаточно. Спасибо!

meerz
Сообщения: 7
Зарегистрирован: 14 сен 2013, 02:14

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

Сообщение meerz » 14 сен 2013, 02:24

Здравствуйте. Действительно полезные уроки. Спасибо.
Есть такая задача - в спиннере надо чтобы элементы списка показывались разным цветом и стилем, а именно чтоб одни элементы, они стоят первыми в списке, были, например, синего цвета и большим шрифтом, а далее элементы серого цвета и меньшим шрифтом. Это делается для того чтобы показать какие элементы на данный момент неактивны, но возможны при каких то условиях. Скажем в полной версии программы.
Заранее спасибо за помощь.

meerz
Сообщения: 7
Зарегистрирован: 14 сен 2013, 02:14

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

Сообщение meerz » 20 сен 2013, 20:35

No answer so far(((. форум живой или вопрос трудный или наоборот вопрос совсем легкий

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

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

Сообщение Foenix » 21 сен 2013, 06:40

я не делала, но по логике - у спиннера есть адаптер (на основе adapter, как у листвью), по идее нужно переопределять его метод getView и там менять цвета и шрифты, как и у листвью.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Rover
Сообщения: 2
Зарегистрирован: 25 окт 2013, 13:24

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

Сообщение Rover » 25 окт 2013, 13:45

У меня проблема с обработчиками нажатий для нескольких последовательно заполняемых спиннеров.
По щелчку на строке первого спиннера обработчик заполняет второй спиннер. Это работает. По щелчку на втором спиннере его обработчик должен точно так же заполнять третий спиннер. Но беда в том, что как только я добавляю обработчик второго спиннера, программа начинает вылетать в NullPointerException.
То есть, совет из этого треда насчет последовательного заполнения спиннеров по событию клика, работает только для одного обработчика и двух спиннеров. Второй обработчик валит программу. Есть подозрение, что в начале работы программа начинает слушать обработчик второго спиннера, создание которого не завершено и ловит исключение по пустому указателю. Как это обойти?
Или причина проще?

UPDСам спросил - сам отвечу. Все спиннеры из последовательной цепочки должны быть полностью активированы (заполнены значениями) до того, как для них объявляются обработчики. Просто прописать spinner в Layout недостаточно. Можно попробовать на старте заполнить все спиннеры, кроме первого, одной пустой строкой.

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

     // устанавливаем обработчик нажатия поля Maker
        spinnerMaker.setOnItemSelectedListener(new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
          int position, long id) {
        	//Заполняем список моделей выбранного производителя
        	setUpCarList();
        }
        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
        }
    });
        
     // устанавливаем обработчик нажатия поля Car_Name
        spinnerCarname.setOnItemSelectedListener(new OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view,
          int position1, long id1) {
        	//Заполняем список опций выбранной модели
        	setUpOptionList();
        }
        @Override
        public void onNothingSelected(AdapterView<?> arg0) {
        }
    });

alex92
Сообщения: 1
Зарегистрирован: 14 ноя 2013, 07:28

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

Сообщение alex92 » 14 ноя 2013, 07:33

setContentView(R.layout.main);
у меня выдает ошибку: create field 'main' in type 'layout'
create constant 'main' in type 'layout'.
что нужно делать?

Аватара пользователя
trew
Сообщения: 450
Зарегистрирован: 28 сен 2013, 17:34

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

Сообщение trew » 14 ноя 2013, 11:22

alex92 писал(а):setContentView(R.layout.main);
у меня выдает ошибку: create field 'main' in type 'layout'
create constant 'main' in type 'layout'.
что нужно делать?
возможно у тебя layout называется activity_main т.е. будет R.layout.activity_main
это можно посмотреть в res\layout\ (раскрой свой проект, слева, в Package Explorer)
Когда выкладываете код на форум - код оформляйте. Редактор - поищите слова Geshi Syntax -Java. (или xml)
Свои сообщения можно редактировать - кнопка edit.

MaxWhite
Сообщения: 4
Зарегистрирован: 25 сен 2013, 22:01

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

Сообщение MaxWhite » 25 ноя 2013, 20:15

Здравствуйте! не подскажите как привязать название элемента в spinner к значению, например 1позиция = 3%, 2позиция = 2%, 3позщиция = 8%, но так чтобы эти проценты шли в строку например (желательно с одним названием) и чтобы можно было их использовать в дальнейших расчетах. например калькулятор, где вводится число, потом выбирается из спиннера процент и ниже выводится посчитанное значение?

Аватара пользователя
kifir
Сообщения: 11
Зарегистрирован: 06 окт 2013, 19:03

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

Сообщение kifir » 05 дек 2013, 22:16

Здравствуйте! У меня есть класс "Activity" и два xml файла - "main"(в нем лежит Spinner) и "text"(в нем лежит TextView). Когда я выбираю в Spinner пункт 1, по открывается text.xml и textview принимает текст R.string.text1. Когда выбираю пункт 2, то открывается все тот же text.xml, но textview уже принимает текст R.string.text2. Только вот не работает(( Вот кусок кода:
switch (selectedItemPosition){
case 0:
Toast toast = Toast.makeText(getApplicationContext(),
"Выберите диету", Toast.LENGTH_SHORT);
toast.show();
break;
case 1:
setContentView(R.layout.text);
text.setText(R.string.arbyz);
break;
case 2:
setContentView(R.layout.text);
text.setText(R.string.banan);
break;
default:
break;
}
В чем я туплю? Ставил Toast, все работало, всплывали названия диет. А делаю как выше - ошибка!
Вот текст ошибки: at dalvik.system.NativeStart.main(Native Method)

Ответить