【问题标题】:Launching activities within a tab in Android在 Android 的选项卡中启动活动
【发布时间】:2009-08-20 14:46:42
【问题描述】:

这是交易。我有一个带有三个选项卡的应用程序。通过与选项卡中的项目的各种交互,我最终启动了其他活动。客户已经对此进行了审查,并希望在选项卡“内”启动活动,因此选项卡保持可见,如果用户单击选项卡,它会返回到 setContent 函数中定义的原始活动。这可能吗?我将如何从其他活动中解决这个问题? (即子活动,而不是定义 TabHost 并有权调用 setContent 的活动)?

【问题讨论】:

    标签: java android


    【解决方案1】:

    可以在标签中启动活动。因此将 tabspec 内容设置为 ActivityGroup 而不是常规 Activity。

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

    然后,您可以从该 ActivityGroup 中启动另一个类似这样的 Activity,它只会更新您所在选项卡的内容视图。

    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);
    
       }
    }
    

    【讨论】:

    • 谢谢...实际上我认为这应该是实现此类功能的正确方法,因为它提供了更好的代码可维护性。
    • 还有另一种优雅的方式吗?不是真的...您始终可以将 TabActivity 类的实例保存在扩展的 Application 类中(以避免全局静态)。当您需要启动一个新活动时,您调用 Application 类以返回 TabActivity 实例并启动一个清除选项卡并重新创建它们但将当前活动替换为新活动的方法。如果有人有兴趣,我可以详细介绍。
    • 嗨,谢谢.. 我可以在同一个选项卡中调用新活动,但是当回到上一个活动时问题就来了。我正在从 ActivityGroup A 调用 Activity B,现在我想再次移动到 ActivityGroup A.. 请给我一个线索.. 谢谢..
    • 它正在工作,但是在五次活动之后,它会意外结束,cz堆栈已满
    • 嗨,我和 manidhar mulaparthi 有同样的问题。我无法与 ActivityGroup 一起回来。任何解决方案都非常感谢。提前致谢。
    【解决方案2】:

    这是我的解决方案

    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

    【讨论】:

    • 其实有一个很大的bug——如果你从activity A 到activity B,然后在activity A 中finish(),上面的代码实际上会完成activity B。
    【解决方案3】:

    【讨论】:

      【解决方案4】:

      你可以使用

      intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      

      对于您设置为 tabSpec 内容的每个活动,它会在您每次按下选项卡时创建此活动

      【讨论】:

        【解决方案5】:

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

        这很好地伪造了它,而且只有 1 个密切相关的活动,我不会因为设计考虑而失去任何睡眠。

        【讨论】:

          【解决方案6】:

          这个问题中的 2 个标签栏怎么样。第一个是菜单底部标签栏,第二个是顶部标签栏,它们是不同的活动和xml

          【讨论】:

            【解决方案7】:

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

            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;
            >     } }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-01-21
              相关资源
              最近更新 更多