2013年7月5日金曜日

onNavigationItemSelected()

ActionBar.OnNavigationListener#onNavigationItemSelected()

第ゼロ番目のアイテムが(利用者の操作によって選択されたのではなく)自動的に選択され、このメソッドが呼ばれる。
ActionBar#setSelectedNavigationItem()の引数にマイナス1を代入しましたが、第ゼロ番目が選択されてしまいます。引数に、任意の項目のIDを代入すると、その代入した値の項目が選択された状態になります。
この不都合を無くすため、第ゼロ番目の項目をダミーにしました。
これでいいのか?(ここで笑う)

Spinnerを使う場合、初期化(初回)の時点で、アイテムが自動的に選択されてしまうという問題があります。
この問題の解決は次のサイトに書かれています。
Android Spinner : Avoid onItemSelected calls during initialization
spinner1に連動して変化するspinner2の初期値設定

boolean型変数を大域変数として設けておき、onItemSelected()において、初期化(初回)時点とそうでない時点を切り分けるという方法ですね。
他に方法は無いものかと考えましたが、分かりませんでした。

ちなみに、onItemSelected()は、選択が変更された場合に呼ばれます。逆に言えば、既に選択済みの項目をクリックしても呼ばれません。
つまり、上記方策を講じて、初回における自動選択問題を回避したとして、利用者の要求が自動選択済みの項目を選択したいということである場合には、その項目をクリックしても、onItemSelected()は呼ばれないということです。一旦別の項目を選択してから、要求する項目を再度クリックし直さねばならないのです。
こんなアホなアプリを作成することはできません。

この不都合を無くすため、第ゼロ番目の項目をダミーにします。
これでいいのか?(ここで再度笑う)

私は(不幸なことに)ArrayAdapter.NO_SELECTIONというのを見つけてしまいました。で、(何かを示唆するかのように)Adapterには、何の解説もありません。(無駄な)期待をして、これをActionBar#setSelectedNavigationItem()の引数に与えて実行してみました。結果、(予期したとおり)第ゼロ番目の項目が選択されたという趣旨でonNavigationItemSelected()が呼ばれました。
こんなんでいいのか?(ここで、もう一度笑う)

第ゼロ番目の項目をダミーにした場合、その必要ではない項目もドロップダウンリストに表示されてしまって不細工である。このため、ダミーをリストに表示しないようにしたいと思い、次のとおりアダプターをカスタマイズしてみました。

    public class Adapter_SR extends ArrayAdapter<String>{
        public Adapter_SR(Context context, int textViewResourceId, List<String> objects) {
            super(context, textViewResourceId, objects);
        }

        @Override
        public View getView(int iID, View v, ViewGroup vg) {
            if(iID==0){
                LayoutInflater inf = getLayoutInflater();
                TextView tv = (TextView)v;
                tv = (TextView)inf.inflate(R.layout.bar_sr, vg, false);
                tv.setText((String)getItem(iID));
                return tv;
            }
            else return super.getView(iID, v, vg);
        }

        @Override
        public View getDropDownView(int iID, View v, ViewGroup vg) {
            LayoutInflater inf = getLayoutInflater();
            TextView tv = (TextView)v;
            if(tv==null){
                if(iID==0){
                    tv = (TextView)inf.inflate(R.layout.bar_sr, vg, false);
                    tv.setTag("Zero");
                }
                else{
                    tv = (TextView)inf.inflate(android.R.layout.simple_spinner_dropdown_item, vg, false);
                    tv.setText((String)getItem(iID));
                }
            }
            else{
                if(iID==0){
                    tv = (TextView)inf.inflate(R.layout.bar_sr, vg, false);
                    tv.setTag("Zero");
                }
                else{
                    String s = (String)tv.getTag();
                    if(s!=null && s.equals("Zero")==true){
                        tv = (TextView)inf.inflate(android.R.layout.simple_spinner_dropdown_item, vg, false);
                        tv.setText((String)getItem(iID));
                    }
                }
            }
            return tv;
        }
    }


0 件のコメント:

コメントを投稿