当这个标签是当前标签时,我正试图找到能够在标签上触发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
所以,下次单击标签时没有任何反应,但我希望正常标签行为。
外面有什么想法吗?
答案 0 :(得分:50)
在通过标签监听器的许多解决方案后,我发现了非常简单的解决方案......
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");
}
}
});
答案 1 :(得分:23)
经过大量思考后,解决方案最终变得比我想象的要容易。我所做的只是创建一个新的子类,它扩展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>
希望这会有所帮助......
答案 2 :(得分:20)
我想我找到了一个解决方案,下面是一个示例代码:
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;
}
});
}
可能有可能改进它,但这对我有用!
答案 3 :(得分:14)
丑陋的修复:在onClickListener中放置:
tabHost.SetCurrentTab(OtherTab);
tabHost.SetCurrentTab(CurrentTab);
其他选项卡的索引在哪里我使用选项卡下最简单的视图。
P.S。客户总是希望他们的应用与众不同:)
这是我使用的代码(我只有2个选项卡Tab1和Tab2):
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);
}
}
});
答案 4 :(得分:5)
此处的问题是,单击所选选项卡时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 :(得分:3)
如果你想尝试 android.support.design.widget.TabLayout ,你可以这样做:
public function add_main_menu($title, $title_ara, $image)
{
$sql = "INSERT INTO menu (title, title_ara, image) VALUES ('$title', '$title_ara', '$image')";
$result = mysqli_query($con, $sql);
return $result;
}
public function add_sub_menu($title, $title_ara, $price, $description, $descreption_ara, $image, $menu_id){
$sql = "INSERT INTO sub_menu (title, title_ara, price, description, description_ara, image, menu_id) VALUES ('$title', '$title_ara', $price, '$description', '$description_ara', '$image', '$menu_id')";
$result = mysqli_query($con, $sql);
return $result;
}
}
答案 6 :(得分:1)
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"));
}
}
});
答案 7 :(得分:0)
如果您有自定义标签布局,可能需要在自定义视图中添加它,它解决了我的问题:
android:duplicateParentState="true"
答案 8 :(得分:0)
这对我有用......
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
}
}
});