スピナーを拡張して新しい機能を実装するにはどうすればよいですか?
-
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);
これは問題なく最初の行に移動しますが、2番目にランタイムエラーが発生し、問題は新しいものを作成していません 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"
/>
解決
最後に、これが適切に機能しない2つの理由がありました。以前の2つの答えは正しいです。
Attributesetパラメーターを使用して2番目のコンストラクターも定義する必要があります。
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です Spinner
またはa CustomSpinner
?
として宣言する必要があります CustomSpinner
あなたがそれをキャストするためのあなたのレイアウトで CustomSpinner
あなたのコードで。
逆の方法は機能します。キャストできるでしょう CustomSpinner
として Spinner
, 、それはサブクラスだからです。