Rom*_*omi 11 android android-tabhost android-tabactivity
在我的项目中,我有两个选项卡和一个按钮.对于两个选项卡,我有两个活动和按钮调用不同的活动.事情是我在第一个标签上显示按钮的结果.即tab0在tab0Event和按钮点击事件上也处于活动状态.并且我能够使用tabHost.setOnTabChangedListener更改选项卡事件,但现在我还想要的是,假设我点击按钮所以现在按钮视图正在显示(tab0处于活动状态)但是再次如果我点击tab0,tab0活动应该是显示.
我尝试了许多点击标签的解决方案,一个是
getTabWidget().getChildAt(getTabHost().getCurrentTab()).setOnClickListener
(new View.OnClickListener() {
@Override public void onClick(View v) {
System.out.println(getTabHost().getCurrentTab());
} });
Run Code Online (Sandbox Code Playgroud)
但是当我使用tabChnageListner这个代码时,tab更改不起作用,我得到了非常意外的结果.你能为我的问题建议解决方案.
谢谢.
用于更改选项卡的代码如下所示:(对于标签更改工作正常,需要在其中添加Tab Onclick)
public class TabLayoutUsingTabChangeEventActivity extends TabActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final TabHost tabHost = (TabHost)findViewById(android.R.id.tabhost);
final TabHost.TabSpec sp1 = tabHost.newTabSpec("TAB1");
TabHost.TabSpec sp2 = tabHost.newTabSpec("TAB2");
//Creating First Tab
Intent intent1 = new Intent(this, Tab1Activity.class);
sp1.setIndicator("TAB1").setContent(intent1);
tabHost.addTab(sp1);
//Creating Second Tab
Intent intent2 = new Intent(this, Tab2Activity.class);
sp2.setIndicator("TAB2").setContent(intent2);
tabHost.addTab(sp2);
//Tab Changed Event
tabHost.setOnTabChangedListener(new OnTabChangeListener(){
@Override
public void onTabChanged(String tabId) {
Log.i("TabId :", tabId);
if(tabId.equals("TAB2")){
Log.i("TAB1", "TAB1 Changed");
Intent intent1 = new Intent().setClass(getApplicationContext(), Tab1Activity.class);
sp1.setIndicator("TAB1").setContent(intent1);
tabHost.setCurrentTab(0);
}
}
});
Button addNewButton = (Button)findViewById(R.id.add_new_ticket_btn);
addNewButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
Intent in = new Intent().setClass(getApplicationContext(), AddNewTicketActivity.class);
sp1.setContent(in);
tabHost.setCurrentTab(0);
//startActivity(in);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
您可以实现此侦听器:
host.setOnTabChangedListener(new OnTabChangeListener()
{
@Override
public void onTabChanged(String tabId)
{
if (getTabHost().getCurrentTabTag().equals("tab0"))
{
host.getCurrentTabView().setOnTouchListener(
new OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
if (event.getAction() == MotionEvent.ACTION_DOWN)
{
if (getTabHost().getCurrentTabTag().equals("tab0")
{
getTabHost().setCurrentTabByTag("tab1");
getTabHost().setCurrentTabByTag("tab0");
}
return false;
}
return false;
}
});
}
}
});
Run Code Online (Sandbox Code Playgroud)
此外,当您为每个选项卡添加标签集标签时:
host.addTab(host.newTabSpec("tab0"));
host.addTab(host.newTabSpec("tab1"));
Run Code Online (Sandbox Code Playgroud)
你不能。TabWidget 中的视图已经具有 onClickListener,并且它是正常工作流程所必需的。如果删除它,您将破坏 TabWidget 的逻辑。
当您设置 onClickListener 时,您会删除以前的 onClickListener 并破坏 TabWidget 逻辑。
通常在这种情况下,会创建复合单击侦听器(一个处理单击事件并调用另一个单击侦听器的单击侦听器)。但在您的情况下则不然,因为 View 没有 getOnClickListener 方法,因此无法获取旧的单击侦听器。
这是TabWidget源代码。所有相关的值都是私有的......所以我们无法从这方面修复任何内容。
实现目标的唯一方法是使用 Reflections 进行 hack,因为它们允许读取私有变量。因此,在设置 View 的新 onlick 侦听器之前,您应该获取旧的 onClickListener(使用 Reflections),然后创建复合 onClickListener,它将执行您的事件处理代码,然后调用旧的 onClickListener。将复合点击侦听器设置为视图。
| 归档时间: |
|
| 查看次数: |
19444 次 |
| 最近记录: |