Кастомный Spinner

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

Кастомный Spinner

Сообщение rezak90 » 02 окт 2012, 18:16

Всё нормально, только не могу понять почему кнопки справа нету, которая со стрелочкой обозначающая выпадания списка:
разметка активити со спинером:

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:background="@drawable/selector_child" >
    
	<TextView
	    android:id="@+id/tvChild"
	    android:layout_width="fill_parent"
	    android:layout_height="fill_parent"
	    android:gravity="center_vertical|center_horizontal"
	    android:textStyle="normal"
	    android:textColor="#000000"
	    android:textSize="14dp"
	    android:padding="8dp" />
    
</LinearLayout>
Разметка с чайлдом:

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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="4dp" >

    <Spinner
        android:id="@+id/spinner"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:prompt="@string/promt"/>

</LinearLayout>
Селекторы для спинера и чайлда:

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

<?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/child_normal" />
    <item android:state_pressed="true" android:drawable="@drawable/child_pressed" />
    <item android:drawable="@drawable/child_normal" />
</selector>

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

<?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_pressed="true" android:drawable="@drawable/spinner_pressed" />
    <item android:drawable="@drawable/spinner_normal" />
</selector>
один пример состояния:

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

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners android:radius="8dp" />
	<gradient
	    android:angle="90"
	    android:endColor="#65F365"
	    android:startColor="#65F365"
	    android:type="linear" />
	<padding
	    android:bottom="6dp"
	    android:left="3dp"
	    android:right="3dp"
	    android:top="6dp" />
	<stroke
	    android:width="3dp"
	    android:color="#000000" />
</shape>
код адаптера:

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

package com.example.customspinner;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class MyAdapter extends ArrayAdapter<String> {

	private LayoutInflater lInflater;
	private String[] data;
	private int layout;
	Context context;
	
	public MyAdapter(Context _context, int layoutResourceId, String[] objects) {
		super(_context, layoutResourceId, objects);
		context = _context;
		layout = layoutResourceId;
		data = objects;
		lInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
	}
	
	@Override
    public View getDropDownView(int position, View convertView,ViewGroup parent) {
        return getCustomView(position, convertView, parent);
    }
	
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        return getCustomView(position, convertView, parent);
    }

    public View getCustomView(int position, View convertView, ViewGroup parent) {
    	View row = convertView;
    	if(row == null) {
    		row = lInflater.inflate(layout, parent, false);
    	}
        TextView label = (TextView)row.findViewById(R.id.tvChild);
        label.setText(data[position]);
        //row.setBackgroundDrawable(context.getResources().getDrawable(R.drawable.selector_child));
        return row;
    }

}
код активити:

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

package com.example.customspinner;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.Spinner;

public class CustomSpinner extends Activity {

	private String[] data = {"Google", "Apple", "Microsoft", "Amazon", "Ebay", "Yandex"};
	private MyAdapter adapter;
	private Spinner spinner;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_spinner);
        init();
    }

    private void init() {
    	spinner = (Spinner)findViewById(R.id.spinner);
    	spinner.setBackgroundResource(R.drawable.selector_spinner);
    	adapter = new MyAdapter(getApplicationContext(), R.layout.child_spinner, data);
    	adapter.setDropDownViewResource(R.layout.child_spinner);
    	spinner.setAdapter(adapter);
    	spinner.setOnItemSelectedListener(new OnItemSelectedListener() {

			public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
				view.setBackgroundDrawable(null);
			}

			public void onNothingSelected(AdapterView<?> parent) {
				
			}
		});
    }
    
}
как мы видим справа нету привычной кнопки у спинера:

Изображение
R.id.team
Политика на форуме запрещена

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

Re: Кастомный Spinner

Сообщение rezak90 » 02 окт 2012, 18:16

я понимаю что много букв, но суть в том что нету кнопочки =)
R.id.team
Политика на форуме запрещена

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Кастомный Spinner

Сообщение neoksi » 02 окт 2012, 20:45

Возможно в Spinner надо активизировать свойство:

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

android:drawSelectorOnTop="true"
Полный пример http://gersic.com/blog.php?id=57

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

Re: Кастомный Spinner

Сообщение rezak90 » 03 окт 2012, 11:44

не помогло, копаю дальше.
Накопал - nine-path. Классная вещь, советую всем ознакомится!
R.id.team
Политика на форуме запрещена

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

Re: Кастомный Spinner

Сообщение Finch » 03 окт 2012, 13:23

rezak90, ты уверен что именно nine-path ???

П.С. а штука таки клёвая не спорю, только родной редактор не удо6ен, есть кастомы.
CEO of a company R.id.team

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

Re: Кастомный Spinner

Сообщение rezak90 » 03 окт 2012, 15:17

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

Аватара пользователя
neoksi
Сообщения: 712
Зарегистрирован: 26 июл 2012, 10:42
Контактная информация:

Re: Кастомный Spinner

Сообщение neoksi » 03 окт 2012, 15:25

Прочитал про эту штуку давно, но предпочитаю рисовать всю графику при помощи xml, легче тянется, а картинки использую только в крайних случаях.

Ответить