/var/log/messages

Dec 3, 2013 - 1 minute read - Comments - android

動的に選択不可な項目を Spinner に設定

簡単にできると踏んでたのですがおお間違い。かなり苦労しましたが何とかなりました。

お助け頂いたのは以下なエントリです。Thx a lot!!

DialogPreference に仕込んだのですが onBindDialogView の定義が以下。

    @Override
    protected void onBindDialogView(View view) {
        super.onBindDialogView(view);

        Spinner spinner = (Spinner)view.findViewById(R.id.spinner);

        SpinnerArrayAdapter mSpinnerArrayAdapter = new SpinnerArrayAdapter(mContext, android.R.layout.simple_spinner_item, spinnerItem);
        mSpinnerArrayAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mSpinnerArrayAdapter.setItemPositionIsDisable(0,true);
        mSpinnerArrayAdapter.setItemPositionIsDisable(1,false);
        mSpinnerArrayAdapter.setItemPositionIsDisable(2,true);
        spinner.setAdapter(mSpinnerArrayAdapter);
    }

で、アダプタの定義が以下。ほぼ丸写し。微調整はしてますが、もう少し云々するかも。

    private class SpinnerArrayAdapter extends ArrayAdapter<String>{

        private int[] ItemPositionIsDisable;

        public SpinnerArrayAdapter(Context context, int textViewResourceId) {
            super(context, textViewResourceId);
        }

        public SpinnerArrayAdapter(Context context, int textViewResourceId, String[] objects) {
            super(context, textViewResourceId,objects);
            ItemPositionIsDisable = new int[objects.length];
        }

        public SpinnerArrayAdapter(Context context,String[] objects){
            this(context, android.R.layout.simple_spinner_item,objects);
            this.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
         }

         public SpinnerArrayAdapter(int stringArrayResourceId,Context context){
             this(context, context.getResources().getStringArray(stringArrayResourceId));
         }
    
         public boolean isEnabled(int position) {
             if (ItemPositionIsDisable[position]==0)
                 return false;
             return true;
         }
    
         public void setItemPositionIsDisable(int position,boolean IsDisable) {

             ItemPositionIsDisable[position] = (IsDisable) ? 1 : 0;
         }
    
         @Override
         public View getDropDownView(int position, View convertView, ViewGroup parent) {

             View mView = super.getDropDownView(position, convertView, parent);
             TextView mTextView = (TextView) mView;

             if (ItemPositionIsDisable[position] == 0) {
                 mTextView.setTextColor(Color.GRAY);
              } else if (ItemPositionIsDisable[position] == 1) {
                 mTextView.setTextColor(Color.BLACK);
            }
            return mView;
       }

いやはや。

追記

これで終わるのはいかにもアレなのでもうちょい確認。以下なドキュメントによると

以下の記述。

Returns true if the item at the specified position is not a separator. (A separator is a non-selectable, non-clickable item).

このメソドが true を戻せば選択可能、という事になるのか。ただ、これって ListAdapter のメソドなんですが、と思ったら superclass の BaseAdapter に isEnabled が定義されているようですね。成程。

Activity 改修に関する自分メモ Kano

comments powered by Disqus