Как я могу расширить счетчик для реализации новой функции? - PullRequest
10 голосов
/ 25 декабря 2010

Я пытаюсь расширить 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, я получаю ошибку времени выполнения как раз в тот момент, когда я устанавливаю Layout в Activity:

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

Ответы [ 3 ]

13 голосов
/ 27 декабря 2010

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

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

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

    <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"
    />
    
9 голосов
/ 25 декабря 2010

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

public CustomSpinner(Context context, AttributeSet attrs) {
    super(context, attrs);
}
2 голосов
/ 25 декабря 2010

Является ли sphofentries Spinner или CustomSpinner?

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

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

...