10

コードでAndroidクラスを拡張して新しい関数を実装しようとしてSpinnerいますが、何らかの理由でこれが機能しませんでした。

これは拡張クラスです:

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、私のレイアウトでスピナーとして宣言されている場合です。

しかし今、私がIとして宣言sphofentriesした場合CustomSpinner、レイアウトをアクティビティに設定した瞬間にランタイムエラーが発生します。

setContentView(R.layout.settings);

また、私がこれを行う場合、問題は、sphofentriesとして宣言する必要があることであると確信しています。CustomSpinner

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

これは最初の行では問題なく進みますが、2番目の行でランタイムエラーが発生します。問題は、新しいものを作成するのではなく、これにCustomSpinner設定することです(これはnotのように宣言されます)。sphofentriesCustomSpinnersphofentriesSpinnerCustomSpinner

たぶん私はレイアウトで何か間違ったことをしている、これは私が次のように宣言し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"
/>
4

3 に答える 3

13

最後に、これが正しく機能しない理由は2つあり、前の2つの答えは正しいです。

  1. AttributeSetパラメーターを使用して2番目のコンストラクターも定義する必要があります。

    public CustomSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    
  2. レイアウトでは、スピナーは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"
    />
    
于 2010-12-26T22:16:29.207 に答える
9

よくある間違いです。このコンストラクターを追加するだけです。これは、レイアウトインフレーターによって呼び出されるコンストラクターです。

public CustomSpinner(Context context, AttributeSet attrs) {
    super(context, attrs);
}
于 2010-12-25T01:37:55.400 に答える
2

sphofentriesはaSpinnerまたはCustomSpinner

CustomSpinnerコードでキャストするには、レイアウトでとして宣言する必要がありCustomSpinnerます。

逆の方法でも機能します。サブクラスであるため、CustomSpinnerをとしてキャストできます。Spinner

于 2010-12-25T17:55:00.523 に答える