开发者

how to Keep Tabhost when start other activity

开发者 https://www.devze.com 2023-04-06 14:08 出处:网络
I have a problem with TabHost... I have TabBarActivity class flow as : public class TabBarActivity extends TabActivity implements OnTabChangeListener{

I have a problem with TabHost...

I have TabBarActivity class flow as :

public class TabBarActivity extends TabActivity implements OnTabChangeListener{

/*
 * (non-Javadoc)
 * 
 * @see android.app.ActivityGroup#onCreate(android.os.Bundle)
 */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);

    setContentView(R.layout.layout_tab);

    TabHost tabHost = (TabHost) findViewById(android.R.id.tabhost);

    TabSpec mTab1 = tabHost.newTabSpec("tab1");
    TabSpec mTab2 = tabHost.newTabSpec("tab2");

    mTab1.setIndicator("TAB1").setContent(
            new Intent(this, TAB1.class))开发者_StackOverflow中文版;
    mTab2.setIndicator("TAB2").setContent(
            new Intent(this, TAB2.class));

    /** Add tabSpec to the TabHost to display. */
    tabHost.addTab(mTab1);
    tabHost.addTab(mTab2);


}

And I have ListView ( such as Contact name ) inside TAB1.java class

Assume : I have a screen layout with 2 tab on bottom ( TAB1, TAB2 ). When I click TAB1 , I have a contact name list and if I click on itemList. The detail screen of ItemList will open. And inside "DetailScreen" layout , i want to keep the (TAB1, TAB2) tabhost on bottom screen.

Now,when I run a application and click itemList . I don't keep the tabhost ( TAB1, TAB2 ) in DetailScreen of each item list...

How to keep it when I start Activity of item list ( such as : DetailScreen.java )

Thanks you


@ all : thanks for your feedback but it seem that you doesn't understand my problem.

My problem : Detail my project : 1- I have some Class: + TabBarActivity.java ( source code flow as above , top page, it have 2 tab on bottom layout Tab1, Tab2.... Default forcus Tab1 when run application) + Tab1.java ( Important : in this class , I have listview ( such as youtube on phone) , when I click one item on List -> open the detail screen for each Item of List... OK ) + Tab2.java ( do something...)

2 - When I run apps , you see 2 Tab on bottom layout and default startActivity Tab1.java -> then show listview in this screen... And when click one item of List -> open detail screen of this item (StartActivity DetailItem.java) -> But 2 Tab on bottom will be disappear....

I don't known why ????

Please help me :((


You have to use TabGroupActivity class,

further more u have to implement Tab1Activity class and Tab2Activity class which are extends from TabGroupActivity

where you will call startChildActivity(TAB1.class) and startChildActivity(TAB2.class) respectively, by this you will have options for your tabs whether u r in TAB1 or TAB2.

you can have the TabGroupActivity class implemented sample good onlinely,

recently i had simillar project thats y m stating like this.


You can achieve this using this custom class :

import java.util.ArrayList;

import android.app.Activity;
import android.app.ActivityGroup;
import android.app.LocalActivityManager;

import android.content.Intent;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Window;

/*
 * The purpose of this Activity is to manage the activities in a tab.
 * Note: Child Activities can handle Key Presses before they are seen here.
 * @author Eric Harlow
 */
public class TabGroupActivity extends ActivityGroup {

    private ArrayList<String> mIdList;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);       
        if (mIdList == null) mIdList = new ArrayList<String>();
    }

    /*
     * This is called when a child activity of this one calls its finish method. 
     * This implementation calls {@link LocalActivityManager#destroyActivity} on the child activity
     * and starts the previous activity.
     * If the last child activity just called finish(),this activity (the parent),
     * calls finish to finish the entire group.
     */
  @Override
  public void finishFromChild(Activity child) {
      LocalActivityManager manager = getLocalActivityManager();
      int index = mIdList.size()-1;

      if (index < 1) {
              finish();
              return;
          }

          manager.destroyActivity(mIdList.get(index), true);
          mIdList.remove(index);
          index--;
          String lastId = mIdList.get(index);
          Intent lastIntent = manager.getActivity(lastId).getIntent();
          Window newWindow = manager.startActivity(lastId, lastIntent);
          setContentView(newWindow.getDecorView());
  }

  /*
   * Starts an Activity as a child Activity to this.
   * @param Id Unique identifier of the activity to be started.
   * @param intent The Intent describing the activity to be started.
   * @throws android.content.ActivityNotFoundException.
   */
  public void startChildActivity(String Id, Intent intent) {     
      Window window = getLocalActivityManager().startActivity(Id,intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP));
      if (window != null) {
          mIdList.add(Id);
          setContentView(window.getDecorView()); 
      }    
  }

  /*
   * The primary purpose is to prevent systems before android.os.Build.VERSION_CODES.ECLAIR
   * from calling their default KeyEvent.KEYCODE_BACK during onKeyDown.
   */
  @Override
  public boolean onKeyDown(int keyCode, KeyEvent event) {
      if (keyCode == KeyEvent.KEYCODE_BACK) {
          //preventing default implementation previous to android.os.Build.VERSION_CODES.ECLAIR
          return true;
      }
      return super.onKeyDown(keyCode, event);
  }

  /*
   * Overrides the default implementation for KeyEvent.KEYCODE_BACK 
   * so that all systems call onBackPressed().
   */
  @Override
  public boolean onKeyUp(int keyCode, KeyEvent event) {
      if (keyCode == KeyEvent.KEYCODE_BACK) {
          onBackPressed();
          return true;
      }
      return super.onKeyUp(keyCode, event);
  }

  /*
   * If a Child Activity handles KeyEvent.KEYCODE_BACK.
   * Simply override and add this method.
   */
  @Override
  public void  onBackPressed  () {
      int length = mIdList.size();
      if ( length >=1) {
          Activity current = getLocalActivityManager().getActivity(mIdList.get(length-1));
          current.finish();
      }
  }
}

And using like this :

In your main class which holds the tabs :

public class MainActivity extends TabGroupActivity {

}

and in your onItemClickListener you can start the activity like this :

startChildActivity("CollectionList", new Intent(this,CollectionMenu.class));

and when you are in CollectionMenu (which extend TabGroupActivity), you can start your child activities like the code below:

Intent previewMessage = new Intent(getParent(), DetailScreen.class);
TabGroupActivity parentActivity = (TabGroupActivity)getParent();
parentActivity.startChildActivity("DetailScreen", previewMessage);

This should work.If you have any problems just ask!


How to use:

In one tab of some tabs such as 4 tabs, every tab extends the TabActivity, in witch u start your really activity using the method startChildActivity.

code

public class Tab_BookCityActivity extends TabGroupActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    startChildActivity("BookCityActivity", new Intent(this, BookCityActivity.class));

    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消