在Android中的标签中启动活动

这是交易。 我有一个三个选项卡的应用程序。 通过与选项卡中的项目的各种交互,我最终启动其他活动。 客户端已经检查了这一点,并希望在标签内“启动”,所以标签保持可见,如果用户点击标签,则返回setContent函数中定义的原始活动。 这是可能的,如何从其他活动去解决这个问题? (即孩子的活动,而不是定义TabHost和访问调用setContent的)?

可以在选项卡中启动活动 。 因此,将tabspec内容设置为一个ActivityGroup,而不是常规的Activity。

tabHost.addTab(tabHost.newTabSpec("Tab") .setIndicator("Tab") .setContent(new Intent(this, YourActivityGROUP.class) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))); 

从该ActivityGroup中,您可以开始另一个这样的活动,只更新您所在的选项卡的内容视图。

 class YourActivityGROUP extends ActivityGroup{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //you van get the local activitymanager to start the new activity View view = getLocalActivityManager() .startActivity("ReferenceName", new Intent(this,YourActivity.class) .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)) .getDecorView(); this.setContentView(view); } } 

这是我的解决scheme

 public class ActivityStack extends ActivityGroup { private Stack<String> stack; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (stack == null) stack = new Stack<String>(); //start default activity push("FirstStackActivity", new Intent(this, FirstStackActivity.class)); } @Override public void finishFromChild(Activity child) { pop(); } @Override public void onBackPressed() { pop(); } public void push(String id, Intent intent) { Window window = getLocalActivityManager().startActivity(id, intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)); if (window != null) { stack.push(id); setContentView(window.getDecorView()); } } public void pop() { if (stack.size() == 1) finish(); LocalActivityManager manager = getLocalActivityManager(); manager.destroyActivity(stack.pop(), true); if (stack.size() > 0) { Intent lastIntent = manager.getActivity(stack.peek()).getIntent(); Window newWindow = manager.startActivity(stack.peek(), lastIntent); setContentView(newWindow.getDecorView()); } } } 

启动标签

 Intent intent = new Intent().setClass(this, ActivityStack.class); TabHost.TabSpec spec = tabHost.newTabSpec("tabId") spec.setContent(intent); 

呼叫下一个活动

 public class FirstStackActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setText("First Stack Activity "); textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(getParent(), SecondStackActivity .class); ActivityStack activityStack = (ActivityStack) getParent(); activityStack.push("SecondStackActivity", intent); } }); setContentView(textView); } } 

再次打电话

 public class SecondStackActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView textView = new TextView(this); textView.setText("First Stack Activity "); textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(); intent.setClass(getParent(), ThirdStackActivity .class); ActivityStack activityStack = (ActivityStack) getParent(); activityStack.push("ThirdStackActivity", intent); } }); setContentView(textView); } } 

在仿真器2.2上工作

我解决了这个问题: 体验 – TabActivity中的多个Android活动

您可以使用

 intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 

对于您设置为tabSpec内容的每个活动,每次按Tab时都会创build此活动

commonsware.com是正确的,这是不可能的。 我有类似的问题,但只有一个活动正在启动。 我牺牲了一点我的架构,并删除了从标签内部启动的活动。 我把代码放在一个视图中,然后我添加了一个ViewAnimator到这个选项卡的活动中。 我覆盖后面的button,如果它的视图,删除该视图,否则让后退button执行正常。

这个假设足够好,只有一个密切相关的活动,我不会因为devise考虑而失去任何睡眠。

如何在这个问题2 tabbar。 第一个是菜单底部的标签栏,第二个是顶部的标签栏,他们是不同的活动和XML

因为我可以从工具栏中的微调打开一个片段或活动?

 import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; > public class MainActivity extends AppCompatActivity { > > @Override > protected void onCreate(Bundle savedInstanceState) { > super.onCreate(savedInstanceState); > setContentView(R.layout.activity_main); > > //Appbar > Toolbar toolbar = (Toolbar) findViewById(R.id.appbar); > setSupportActionBar(toolbar); > getSupportActionBar().setDisplayShowTitleEnabled(false); > > //Appbar page filter > Spinner cmbToolbar = (Spinner) findViewById(R.id.CmbToolbar); > > ArrayAdapter<String> adapter = new ArrayAdapter<>( > getSupportActionBar().getThemedContext(), > R.layout.appbar_filter_title, > new String[]{"Opción 1 ", "Opción 2 ", "Opción 3 "}); > > adapter.setDropDownViewResource(R.layout.appbar_filter_list); > > cmbToolbar.setAdapter(adapter); > > cmbToolbar.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { > @Override > public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) { > //... Acciones al seleccionar una opción de la lista > Log.i("Toolbar 3", "Seleccionada opción " + position); > > Fragment f = null; > > switch(position) { > case 0: > f = Fragment2.newInstance(); > break; > > case 1: > f = Fragment1.newInstance(); > break; > > } > } > > @Override > public void onNothingSelected(AdapterView<?> adapterView) { > //... Acciones al no existir ningún elemento seleccionado > } > }); > } > > @Override > public boolean onCreateOptionsMenu(Menu menu) { > // Inflate the menu; this adds items to the action bar if it is present. > getMenuInflater().inflate(R.menu.menu_main, menu); > return true; > } > > @Override > public boolean onOptionsItemSelected(MenuItem item) { > // Handle action bar item clicks here. The action bar will > // automatically handle clicks on the Home/Up button, so long > // as you specify a parent activity in AndroidManifest.xml. > int position = item.getItemId(); > > Fragment f = null; > > switch(position) { > case 0: > f = Fragment2.newInstance(); > break; > > case 1: > f = Fragment1.newInstance(); > break; > > case 2: > Intent intent = new Intent(getApplicationContext(), Fragment1.class); > startActivity(intent); > break; > > } > return super.onOptionsItemSelected(item); > } > > > public Fragment getItem(int position) { > > Fragment f = null; > > switch(position) { > case 0: > f = Fragment2.newInstance(); > break; > > case 1: > f = Fragment1.newInstance(); > break; > > case 2: > Intent intent = new Intent(getApplicationContext(), Fragment1.class); > startActivity(intent); > break; > > } > > return f; > } }