12505


TabHostのsetOnClickListenerの表記の仕方を教えて下さい。

詳細：  
お世話なっております。

下記の質問から派生した質問です。  
「現在、「開いているタブボタン」を押した際に、設定しているWebViewの再読込（Top画面）を読み込むにはどのようにすればよいのでしょうか？」

下記のコードで目的の動きが可能になったのですが、コードが長くなるため他の短くなる書き方について勉強しております。

[code]

    //tab0　再クリック時に表示画面を戻す
    mTabHost.getTabWidget().getChildAt(0).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.e("mTabHost.getTabWidget()", "tab0　クリック");
            mTabHost.setCurrentTab(1);//一度、tab1を表示させ（なんちゃって初期化？）すぐに下を表示させる)
            mTabHost.setCurrentTab(0);//これでtab0が表示される
        }
    });
    //tab1　再クリック時に表示画面を戻す
    mTabHost.getTabWidget().getChildAt(1).setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Log.e("mTabHost.getTabWidget()", "tab1　クリック");
            mTabHost.setCurrentTab(0);//一度、tab0を表示させ（なんちゃって初期化？）すぐに下を表示させる)
            mTabHost.setCurrentTab(1);//これでtab1が表示される
        }
            });
    
[/code]

例えば、以下のようにしたいのですが、onClick内の「i」の処理に困っているところです。  
アドバイスを頂ければ幸いです。

[code]

    for (int i = 0; i < 4; i++) {       
        mTabHost.getTabWidget().getChildAt(i).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if( i == 0){//ここがエラー
                    Log.e("mTabHost.getTabWidget()", "tab0をクリック");
                    mTabHost.setCurrentTab(1);
                }else{
                    Log.e("mTabHost.getTabWidget()", "tab0以外をクリック");
                    mTabHost.setCurrentTab(0);
                }
                mTabHost.setCurrentTab(i);//ここがエラー
            }
        });
    }
    
[/code]


CC BY-SA 3.0
2015-07-19T23:27:40.913
12492
2015-07-20T12:03:23.583
8670
question
android android-fragments
TabHostのsetOnClickListenerの表記の仕方を教えて下さい。


`mTabHost.getTabWidget().getChildAt(i)`で取得できるViewの`Tag`に、自分の位置を教える方法はどうでしょうか？

[code]

    for (int i = 0; i < 4; i++) {       
        View tab = mTabHost.getTabWidget().getChildAt(i);
        tab.setTag(i); // 位置を教える
        tab.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = (int)v.getTag();
                if(position == 0) { 
                    Log.e("mTabHost.getTabWidget()", "tab0をクリック");
                    mTabHost.setCurrentTab(1);
                } else {
                    Log.e("mTabHost.getTabWidget()", "tab0以外をクリック");
                    mTabHost.setCurrentTab(0);
                }
                mTabHost.setCurrentTab(position);
            }
        });
    }
    
[/code]


CC BY-SA 3.0
2015-07-20T11:45:25.127
12504
2015-07-20T12:03:23.583
2015-07-20T12:03:23.583
845
845
12492
answer


変数`i`を渡すとエラーとなるのは、匿名内部クラスに非finalなローカル変数を渡せないJavaの制約によるものです。

一度finalなローカルな変数を作って渡せば良いように思います。

[code]

    for (int i = 0; i < 4; i++) {
        final int j = i;
        mTabHost.getTabWidget().getChildAt(i).setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if(j == 0){
                    Log.e("mTabHost.getTabWidget()", "tab0をクリック");
                    mTabHost.setCurrentTab(1);
                }else{
                    Log.e("mTabHost.getTabWidget()", "tab0以外をクリック");
                    mTabHost.setCurrentTab(0);
                }
                mTabHost.setCurrentTab(j);
            }
        });
    }
    
[/code]


CC BY-SA 3.0
2015-07-20T11:52:55.897
12505
2015-07-20T11:52:55.897
5337
12492
answer