web-dev-qa-db-ja.com

Android TabWidgetは現在のタブのクリックを検出します

このタブが現在のタブであるときに、タブでonclickイベントを起動できる方法を見つけようとしています。

私は(他のいくつかの中で)この方法を試みましたが、成功しませんでした。

public void onTabChanged(String tabId) {
    Log.d(this.getClass().getName(), ">>>>>>>>>>>>>>>>>>>>>>>> tabId: " + tabId);

    int tabs = getTabWidget().getChildCount();
    Log.d(this.getClass().getName(), "tabs: " + tabs);
    for(int i=0; i<tabs; i++){
        View tab = getTabWidget().getChildAt(i);
        if(i==tabHost.getCurrentTab()){
            Log.d(this.getClass().getName(), "tab: " + i);
            tab.setOnClickListener(this);
        }else{
            tab.setOnClickListener(null);
            tab.getOnFocusChangeListener();
        }
    }   
}

ポイントは、onClickListenernullに設定することです。したがって、次にタブをクリックしても何も起こりませんが、normal tabの動作が必要です。 。

外にアイデアはありますか?

35
0m4r

私は解決策を見つけたと思う、ここにサンプルコードが続く:

    intent = new Intent(this, HomeGroup.class);
    View tab1 = _inflater.inflate(R.layout.custom_tab_1,null);
    homeTab.setTag("Tab1");
    spec = tabHost.newTabSpec("Tab1").setIndicator(tab1).setContent(intent);
    tabHost.addTab(spec);

    View tab2 = _inflater.inflate(R.layout.custom_tab_2,null);
    homeTab.setTag("Tab2");
    spec = tabHost.newTabSpec("Tab2").setIndicator(tab2).setContent(intent);
    tabHost.addTab(spec);

    View tab3 = _inflater.inflate(R.layout.custom_tab_3,null);
    homeTab.setTag("Tab3");
    spec = tabHost.newTabSpec("Tab3").setIndicator(tab3).setContent(intent);
    tabHost.addTab(spec);

    tabHost.setOnTabChangedListener(this);

    //click on seleccted tab
    int numberOfTabs = tabHost.getTabWidget().getChildCount();
    for(int t=0; t<numberOfTabs; t++){
        tabHost.getTabWidget().getChildAt(t).setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if(event.getAction()==MotionEvent.ACTION_UP){

                    String currentSelectedTag = MainTab.this.getTabHost().getCurrentTabTag();
                    String currentTag = (String)v.getTag();
                    Log.d(this.getClass().getSimpleName(), "currentSelectedTag: " + currentSelectedTag + " currentTag: " + currentTag);
                    if(currentSelectedTag.equalsIgnoreCase(currentTag)){
                        MainTab.this.getTabHost().setCurrentTabByTag(currentTag);
                        String newSelectedTabTag = MainTab.this.getTabHost().getCurrentTabTag();
                        if(newSelectedTabTag.toLowerCase().indexOf("tab1")!=-1){
                            //do smthg
                        }else if(newSelectedTabTag.toLowerCase().indexOf("tab1")!=-1){
                            //do smthg
                        }else if(newSelectedTabTag.toLowerCase().indexOf("tab3")!=-1){
                            //do smthg
                        }
                        return true;
                    }
                }
                return false;
            }
        });
    }       

おそらくそれを改善することは可能ですが、これは私のために仕事をします!

20
0m4r

タブリスナーの多くのソリューションを調べた後、非常に簡単なソリューションを見つけました...

getTabHost().setOnTabChangedListener(new OnTabChangeListener() {

@Override
public void onTabChanged(String tabId) {

int i = getTabHost().getCurrentTab();
 Log.i("@@@@@@@@ ANN CLICK TAB NUMBER", "------" + i);

    if (i == 0) {
            Log.i("@@@@@@@@@@ Inside onClick tab 0", "onClick tab");

    }
    else if (i ==1) {
            Log.i("@@@@@@@@@@ Inside onClick tab 1", "onClick tab");
    }

  }
});
50
Chirag_CID

これについて多くのことを考えた結果、解決策は思ったより簡単になりました。私がやったのは、TabHostを拡張し、setCurrentTabメソッドを次のようにオーバーライドする新しい子クラスを作成するだけです。

package com.mycompany.Views;

import Android.content.Context;
import Android.util.AttributeSet;
import Android.widget.TabHost;
import Android.widget.Toast;

public class ReclickableTabHost extends TabHost {

    public ReclickableTabHost(Context context) {
        super(context);
    }

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

    @Override
    public void setCurrentTab(int index) {
        if (index == getCurrentTab()) {
            // FIRE OFF NEW LISTENER
        } else {
            super.setCurrentTab(index);
        }
    }
}

典型的なTabHostの代わりに新しいクラスを使用するには、次のようにレイアウトxmlファイルを編集します。

<FrameLayout
    Android:layout_height="match_parent"
    Android:layout_width="0dip"
    Android:layout_weight=".8">

    <com.myCompany.Views.ReclickableTabHost
        Android:id="@Android:id/tabhost"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:visibility="gone">

        <LinearLayout
            Android:orientation="vertical"
            Android:layout_width="fill_parent"
            Android:layout_height="fill_parent">

            <TabWidget
                Android:id="@Android:id/tabs"
                Android:layout_width="fill_parent"
                Android:layout_height="wrap_content"
                Android:background="@drawable/tab_unselected_holo"/>
            <FrameLayout
                Android:id="@Android:id/tabcontent"
                Android:layout_width="fill_parent"
                Android:layout_height="fill_parent">
            </FrameLayout>

        </LinearLayout>

    </com.myCompany.Views.ReclickableTabHost>

お役に立てれば...

24
SteveBorkman

Glyい修正:onClickListener putで:tabHost.SetCurrentTab(OtherTab); tabHost.SetCurrentTab(CurrentTab); [その他のタブのインデックスの場所]タブの下で最も単純なビューを使用します。

追伸顧客は常に自分のアプリが違うことを望んでいます:)

これは私が使用するコードです(Tab1とTab2の2つのタブしかありません):

 getTabWidget().getChildAt(1).setOnClickListener(new OnClickListener() { 
            @Override 
            public void onClick(View v) { 

                Log.d(TAG,"1"+getTabHost().getCurrentTabTag());

                if (getTabHost().getCurrentTabTag().equals("Tab2")) { 
                    Log.d(TAG,"2");

                    tabHost.setCurrentTab(0);                                    
                    tabHost.setCurrentTab(1);

                } else {
                    tabHost.setCurrentTab(1);
                }
            } 
        });
14

ここでの問題は、選択したタブをクリックしてもsetOnTabChangedListenerが起動せず、タブにOnClickListenerを設定すると、通常のタブの動作が失われることです。

そのため、簡単な解決策は、OnClickListenerをタブに配置し、その中に、これが現在のタブであることをプログラムで設定することです。

TabHostの場合:

getTabWidget().getChildAt(0).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // custom code
        tabHost.setCurrentTab(0);                                    
    }
});

TabLayoutあり

tabLayout.getTabAt(0)setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                    // custom code
                    TabLayout.Tab tab  = tabLayout.getTabAt(0);
                    tab.select();
                }
            }
        });
5
ElYeante

Android.support.design.widget.TabLayoutを試してみたい場合は、次のように実現できます。

tabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
   @Override public void onTabSelected(Tab tab) {

   }

   @Override public void onTabUnselected(Tab tab) {

   }

   @Override public void onTabReselected(Tab tab) {

   }
});
4
Yuchen Zhong
mTabHost.setOnTabChangedListener(new OnTabChangeListener() {

        @Override
        public void onTabChanged(String tabId) {

            int i = mTabHost.getCurrentTab();
            mTabHost.getTabWidget().getChildAt(i)
                    .setBackgroundColor(Color.parseColor("#014a68"));

            //int m = mTabHost.getChildCount();
            for (int j = 0; j <=3; j++) {
                if (j != i)
                    mTabHost.getTabWidget()
                            .getChildAt(j)
                            .setBackgroundColor(Color.parseColor("#000000"));
            }


        }
    });
1
Hasan Masud

これは私のために働いています...

TabHost Host = (TabHost)findViewById(R.id.tabHost);

Host.setOnTabChangedListener(new OnTabChangeListener() {
    @Override
    public void onTabChanged(String tabId) {

        int i = Host.getCurrentTab();

        if (i == 0) {
             // your method 1
        }
        else if (i ==1) {
            // your method 2
        }
    }
});
0
Ms. Sonia

カスタムタブレイアウトがある場合、カスタムビューにこれを追加する必要があるかもしれません、それは私の問題を解決しました:

Android:duplicateParentState="true"
0
ODAXY