Как я могу расширить Spinner для реализации новой функции?
-
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"
/>
Решение
Наконец, у этого было две причины не работать должным образом, два предыдущих ответа верны:
Необходимо определить также второй конструктор с параметром атрибута.
public CustomSpinner(Context context, AttributeSet attrs) { super(context, attrs);
В макете спиннер должен быть определен как пользовательский, и должен быть объявлен всем полностью квалифицированным именем:
<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
, потому что это подкласс.