Как я могу расширить Spinner для реализации новой функции?

StackOverflow https://stackoverflow.com/questions/4528976

  •  13-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь продлить Spinner Класс Android в моем коде для реализации новой функции, но по какой -то причине это не сработало.

Это расширенный класс:

import android.content.Context;
import android.widget.AdapterView;
import android.widget.Spinner;

public class CustomSpinner extends Spinner {

    public CustomSpinner(Context context) {
        super(context);
    }

    public void setSelectionByItemId(AdapterView<?> parent, long id){
        for (int i = 0; i < parent.getCount(); i++) {              
            long itemIdAtPosition = parent.getItemIdAtPosition(i);
            if (itemIdAtPosition == id) {
                parent.setSelection(i);
                break;
            }
        }
    }
}

И так я создаю этот класс:

CustomSpinner spinner = (CustomSpinner) findViewById(R.id.sphofentries);

Это дает мне ошибку во время выполнения.

Все это, если R.id.sphofentries объявлен в моем макете как прядильщик.

Но теперь, если я объявлю sphofentries как CustomSpinner Я получаю ошибку во время выполнения в тот момент, когда установил макет на действие:

setContentView(R.layout.settings);

Также я почти уверен, что проблема в том, что мне нужно объявить sphofentries как CustomSpinner Потому что, если я сделаю это:

CustomSpinner spinner = new CustomSpinner(this);
spinner = (CustomSpinner) findViewById(R.id.sphofentries);

Это идет без проблем в корыте первой строки, но дает ошибку времени выполнения во втором, чем проблема не создает новой CustomSpinner но установление sphofentries в этом CustomSpinner (Это с sphofentries объявлен как Spinner не CustomSpinner).

Может быть, я делаю что -то не так в макете, я и объявляю sphofentries как CustomSpinner:

<CustomSpinner 
    android:id="@+id/sphofentries"
    android:layout_below="@+id/tvhofentries"
    android:layout_width="300dip"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
/>
Это было полезно?

Решение

Наконец, у этого было две причины не работать должным образом, два предыдущих ответа верны:

  1. Необходимо определить также второй конструктор с параметром атрибута.

    public CustomSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    
  2. В макете спиннер должен быть определен как пользовательский, и должен быть объявлен всем полностью квалифицированным именем:

    <net.domain.package.CustomSpinner  
        android:id="@+id/sphofentries" 
        android:layout_below="@+id/tvhofentries"
        android:layout_width="300dip"       
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
    />
    

Другие советы

Это обычная ошибка. Просто добавьте этот конструктор, который называется складом макета:

public CustomSpinner(Context context, AttributeSet attrs) {
    super(context, attrs);
}

Sphofentries a Spinner или CustomSpinner?

Это должно быть объявлено как CustomSpinner в вашем макете, чтобы вы могли разыграть это CustomSpinner в вашем коде.

Другой путь сработал. Вы сможете разыграть CustomSpinner как Spinner, потому что это подкласс.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top