スピナーを拡張して新しい機能を実装するにはどうすればよいですか?

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);

これは問題なく最初の行に移動しますが、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つの答えは正しいです。

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

    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です Spinner またはa CustomSpinner?

として宣言する必要があります CustomSpinner あなたがそれをキャストするためのあなたのレイアウトで CustomSpinner あなたのコードで。

逆の方法は機能します。キャストできるでしょう CustomSpinner として Spinner, 、それはサブクラスだからです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top