在 tabhost 中重新加载一个活动

Posted

技术标签:

【中文标题】在 tabhost 中重新加载一个活动【英文标题】:Reload an activity inside tabhost 【发布时间】:2012-08-10 13:21:19 【问题描述】:

我有一个 tabhost,我在那里添加了 3 个活动(每个选项卡一个活动)。 每次更改选项卡时,我都需要知道如何在活动中调用新实习生。 我为 tabhost 添加了一个侦听器。当我使用 clearAllTabs(); 方法并在侦听器中再次添加所有选项卡时,应用程序崩溃了。 当我使用代码从视图中删除用户单击的特定选项卡tabHost.getTabWidget().removeView(tabHost.getTabWidget().getChildTabViewAt(i)); tabHost.addTab(the tab I want to replace);

然后新标签位于标签主机的末尾。

我只需要一个示例,说明每次用户单击特定选项卡时如何重新加载相应的活动。

我的代码:

@Override
    public void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        // ActionBar bar = getSupportActionBar();

        // requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);

        Resources res = getResources();
        LocalActivityManager mlam = new LocalActivityManager(this, false);
        final TabHost tabHost = (TabHost) findViewById(android.R.id.tabhost);
        mlam.dispatchCreate(savedInstanceState);
        tabHost.setup(mlam);
        TabHost.TabSpec spec;
        Intent intent;

        // TabHost tabHost = getTabHost();
        // tabHost.setup();

        TabSpec specAll = tabHost.newTabSpec("All");
        specAll.setIndicator("All");
        Intent allIntent = new Intent(this, allActivity.class);
        specAll.setContent(allIntent);

        // specAll.setContent(R.id.allList);

        Log.d("SpecAll",""+specAll.setContent(allIntent));

        TabSpec specIn = tabHost.newTabSpec("in");
        specIn.setIndicator("In");
        Intent inIntent = new Intent(this, inActivity.class);
        specIn.setContent(inIntent);

        TabSpec specOut = tabHost.newTabSpec("Out");
        specOut.setIndicator("Out");
        Intent outIntent = new Intent(this, outActivity.class);
        specOut.setContent(outIntent);

        // Adding all TabSpec to TabHost
        tabHost.addTab(specAll); // Adding all tab
        tabHost.addTab(specIn); // Adding in tab
        tabHost.addTab(specOut); // Adding out tab



        tabHost.setOnTabChangedListener(new OnTabChangeListener() 



                        @Override
                        public void onTabChanged(String tabId) 

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

                            if (i == 0) 
                                Log.d("TAB","" +i);

                             else if (i == 1) 
                                Log.d("TAB","" +i);
                            
                            else
                                Log.d("TAB", ""+i);
                        
                    );


    

【问题讨论】:

我也遇到了这个问题,但略有不同:我想在一个标签中替换活动。我没有找到解决方案,而是保存所有选项卡内容,关闭 TabActivity,立即重新打开它并恢复内容。我确信有更好的解决方案。 我发布了解决方案伙伴。欢呼 【参考方案1】:

在我不需要保留选项卡片段的简单情况下,我使用下一个代码

        int currentTabId = mTabHost.getCurrentTab();
    mTabHost.clearAllTabs();
    setupTabs();
    mTabHost.setCurrentTab(currentTabId);

【讨论】:

你节省了我的时间......爱你 【参考方案2】:

我也面临同样的问题,但我是这样解决这个问题的......

这是我的 TabActivity....

public class MainActivity extends TabActivity 
TabHost tabhost;
String cTab = "0";
String nTab;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
            WindowManager.LayoutParams.FLAG_FULLSCREEN);
    setContentView(R.layout.activity_main);
    tabhost = getTabHost();

    TabSpec one = tabhost.newTabSpec("0");

    // setting Title and Icon for the Tab
    one.setIndicator("", getResources().getDrawable(R.drawable.ic_launcher));
    Intent songsIntent = new Intent(this, FirstActivity.class);
    one.setContent(songsIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
    one.setContent(songsIntent);

    TabSpec two = tabhost.newTabSpec("1");
    // setting Title and Icon for the Tab
    two.setIndicator("", getResources().getDrawable(R.drawable.ic_launcher));
    Intent songsIntent1 = new Intent(this, SecondActivity.class);
    two.setContent(songsIntent1.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
    two.setContent(songsIntent1);

    TabSpec three = tabhost.newTabSpec("2");
    // setting Title and Icon for the Tab

    three.setIndicator("",
            getResources().getDrawable(R.drawable.ic_launcher));
    Intent songsIntent4 = new Intent(this, ThirdActivity.class);
    three.setContent(songsIntent4.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
    three.setContent(songsIntent4);

    TabSpec four = tabhost.newTabSpec("3");
    // setting Title and Icon for the Tab
    four.setIndicator("", getResources()
            .getDrawable(R.drawable.ic_launcher));
    Intent songsIntent5 = new Intent(this, FourthActivity.class);
    four.setContent(songsIntent5.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
    four.setContent(songsIntent5);

    tabhost.addTab(one);
    tabhost.addTab(two);
    tabhost.addTab(three);
    tabhost.addTab(four);
    tabhost.setOnTabChangedListener(new OnTabChangeListener() 
        @Override
        public void onTabChanged(String arg0) 
            cTab = "" + tabhost.getCurrentTab();

        
    );

    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 = MainActivity.this
                                    .getTabHost().getCurrentTabTag();
                            nTab = currentSelectedTag;
                            System.out.println(" nTab  " + nTab);
                            System.out.println("  cTab  " + cTab);
                            if (cTab.equals(nTab)) 
                                if (nTab.equals("0")) 
                                    Intent intent = new Intent();
                                    intent.setAction("com.ensis.first");
                                    MainActivity.this.sendBroadcast(intent);
                                
                                if (nTab.equals("1")) 
                                    Intent intent = new Intent();
                                    intent.setAction("com.ensis.second");
                                    MainActivity.this.sendBroadcast(intent);
                                
                                if (nTab.equals("2")) 
                                    Intent intent = new Intent();
                                    intent.setAction("com.ensis.third");
                                    MainActivity.this.sendBroadcast(intent);
                                
                                if (nTab.equals("3")) 
                                    Intent intent = new Intent();
                                    intent.setAction("com.ensis.fourth");
                                    MainActivity.this.sendBroadcast(intent);
                                
                            
                        
                        return false;
                    
                );
    


@Override
public boolean onCreateOptionsMenu(Menu menu) 
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
 

这是我的 FirstActivity.java

    public class FirstActivity extends ActivityGroup
    @Override
    protected void onCreate(Bundle savedInstanceState) 
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);

ok();
IntentFilter filter = new IntentFilter("com.ensis.first");
registerReceiver(myReceiver, filter);

/**/
    

    private void ok() 
// TODO Auto-generated method stub
setContentView(R.layout.firstscreen);
Button bt=(Button)findViewById(R.id.button1);
bt.setOnClickListener(new OnClickListener() 

    @Override
    public void onClick(View v) 
        // TODO Auto-generated method stub
        Intent it=new Intent(FirstActivity.this,SubActivity.class);
        replaceContentView("activity3", it);
    
  );
      

          public void replaceContentView(String id, Intent newIntent) 
        View view = getLocalActivityManager().startActivity(id,newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
        this.setContentView(view);
    

     private BroadcastReceiver myReceiver = new BroadcastReceiver()
     
    @Override
    public void onReceive(Context context, Intent intent) 
        Log.v("22222222222222222", "22222222222");
        ok();
    
      ;

【讨论】:

【参考方案3】:

似乎activity和tabhost有问题。为了重新加载你只需要做的活动:

specAll.setContent(yourIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));

就在 tabHost.addTab 之前

【讨论】:

以上是关于在 tabhost 中重新加载一个活动的主要内容,如果未能解决你的问题,请参考以下文章

如何在tabhost中居中文本?

Android 实现分页(使用TabWidget/TabHost)

当我在eclipse中单击按钮时,使用tabHost并转到特定选项卡

Android 预加载 TabHost 视图

在 TabHost 中 onActivityResult 不起作用

当我单击 Eclipse 中的按钮时,使用 tabHost 并转到特定选项卡