このタブが現在のタブであるときに、タブで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();
}
}
}
ポイントは、onClickListener
をnull
に設定することです。したがって、次にタブをクリックしても何も起こりませんが、normal tabの動作が必要です。 。
外にアイデアはありますか?
私は解決策を見つけたと思う、ここにサンプルコードが続く:
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;
}
});
}
おそらくそれを改善することは可能ですが、これは私のために仕事をします!
タブリスナーの多くのソリューションを調べた後、非常に簡単なソリューションを見つけました...
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");
}
}
});
これについて多くのことを考えた結果、解決策は思ったより簡単になりました。私がやったのは、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>
お役に立てれば...
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);
}
}
});
ここでの問題は、選択したタブをクリックしても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();
}
}
});
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) {
}
});
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"));
}
}
});
これは私のために働いています...
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
}
}
});
カスタムタブレイアウトがある場合、カスタムビューにこれを追加する必要があるかもしれません、それは私の問題を解決しました:
Android:duplicateParentState="true"