8

ユーザーがアイテムを長時間クリックしたときのスピナーの動作を変えようとしています。私はいくつかのプロジェクトでスピナーを持っています、そして私は2つのことを望みます。

  1. ユーザーがアイテムをクリックするだけで、通常はそれを選択します。
  2. ユーザーが「アイテムの編集」、「アイテムの削除」などのオプションを使用して、表示したいアイテムをクリックしたとき。

最初のステップは(もちろん)うまく機能しますが、2番目のタスクを実行しようとすると、スピナーでlongClickedイベントを生成できません。

これが私のコードです:

    this.projectSpinner = (Spinner) this.findViewById(R.id.SpinnerProjects);
    this.projectSpinner.setLongClickable(true);

    this.projectSpinner.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
        public boolean onItemLongClick(AdapterView<?> arg0, 
                                       View arg1, 
                                       int arg2, 
                                       long arg3) {
            Toast.makeText(
                 AndroidTimeTrackerMainActivity.this, 
                 "Long click", 
                 Toast.LENGTH_SHORT).show(); // This toast doesn't show up.
            return false;
        }

    });
4

4 に答える 4

15

現在SpinnerはサポートしていませんOnItemLongClickListener

于 2010-04-28T18:19:26.987 に答える
8

ただし、OnLongClickListenerをスピナーに追加することはできます。メニューの項目を長押ししても起動しませんが、ユーザーがスピナー自体を長押しすると起動します。

this.projectSpinner.setOnLongClickListener(new OnLongClickListener() 
{
    @Override
    public boolean onLongClick(View v) 
    {
        System.out.println(chuteSpinner.getSelectedItem().toString() + " is long clicked");
        return true;
    }
});
于 2011-12-28T16:39:21.233 に答える
2

1)スピナーを拡張して、カスタムスピナークラスを作成します。

public class CCSpinner extends Spinner {
    public CCSpinner(Context context) {
        super(context);
    }

    public CCSpinner(Context context, int mode) {
        super(context, mode);
    }

    public CCSpinner(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CCSpinner(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public CCSpinner(Context context, AttributeSet attrs, int defStyleAttr, int mode) {
        super(context, attrs, defStyleAttr, mode);
    }

    @Override
    public void onDetachedFromWindow() {
        super.onDetachedFromWindow();
    }
} 

xmlビューで上記のスピナーを使用します。

2)クリックを処理するためのインターフェースを定義します。

 public interface ClickListener {
        void onItemLongClicked(View view);
        void onItemClicked(View view);
    }

3)スピナーアダプタクラスで、getViewとgetDropDownViewでこれらの処理を実行します

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //ususal stuffs
        convertView.setTag(R.string.click_tag, position);
        convertView.setClickable(false);
        convertView.setLongClickable(false);



        return convertView;
    }


    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        //ususal stuffs
        convertView.setTag(R.string.click_tag, position);

        convertView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (clickListener != null) {
                    clickListener.onItemClicked(v);
                }
            }
        });


        convertView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if (clickListener != null) {
                    clickListener.onItemLongClicked(v);
                }
                return true;
            }
        });

        return convertView;
    }

4)アダプターをインスタンス化するときに、作成したClcikListenerインターフェースを渡します。

5)実装クラスで、次のことを行います。

@Override
    public void onItemLongClicked(final View view) {
        mPSpinner.onDetachedFromWindow();
        final int pos = (int) view.getTag(R.string.click);
        mPSpinner.setSelection(pos);
    }


    @Override
    public void onItemClicked(final View view) {
        mPSpinner.onDetachedFromWindow();
        int pos = (int) view.getTag(R.string.click);
        mPSpinner.setSelection(pos);
    }
于 2016-02-04T07:19:36.247 に答える
0

ハンドラー付きのタッチリスナーを使用するだけです。選択したアイテムを取得するため

spinner.getSelectedItemPosition
于 2018-02-28T16:27:14.157 に答える