【问题标题】:Android Tabs with ListActivity BackButton带有 ListActivity BackButton 的 Android 选项卡
【发布时间】:2013-04-24 18:37:36
【问题描述】:

我有 3 个标签

Tab1,Tab2,Tab3

public Class TabLayout extends TabActivity {
    Tab1,Tab2,Tab3
}

每个 Tab 包含一个 ListActivity

意思是

Tab1>>>Tab1ListActivity(图文列表)

Tab2>>>Tab2ListActivity(带图片和文字的列表)

Tab3>>>Tab3ListActivity(带图片和文字的列表)

如果我从(Tab1ListActivity、Tab2ListActivity 等......)点击任何列表项

我正在转发另一个活动(Tab1ListItemActivity、Tab2ListItemActivity 等......)

但我的实际要求是,如果假设我从 Tab2ListItemActivity 点击后退按钮,那么我

应该可以转发到Tab2ListActivity

但是,如果我这样写代码

public class Tab2ListItemActivity extends Activity
{

    //on Back Button Pressed

    Intent intent=new Intent(Tab2ListItemActivity.this,TabLayout.class);

    startActivity(intent);

    Tab2ListItemActivity.this.finish();
}

当我执行上述代码时,我可以转发到我的 TabLayout(Tab1ListActivity) 但不能转发到 Tab2ListActivity?,因为

与Tab2ListActivity相关的Tab2ListItemActivity

有人可以帮忙吗?

【问题讨论】:

  • 为什么不保留默认行为(不要覆盖 onBackPressed)?它将恢复到以前的活动。
  • 当默认行为为您服务时,为什么要覆盖 OnBackPressed

标签: android android-layout android-intent android-widget


【解决方案1】:

为什么不保留默认行为(不要覆盖 onBackPressed)?它将恢复到以前的活动。

解决方案 1:

不要完成 TabLayout Activity。并在 Tab2ListItemActivity 活动中保留返回按钮的默认实现。

解决方案 2(强硬的方式):

在应该打开的选项卡上添加额外的意图。

Intent intent = new Intent(Tab2ListItemActivity.this, TabLayout.class);
intent.putExtra(TabLayout.EXTRA_TAB_TO_OPEN, 1);
startActivity(intent);
Tab2ListItemActivity.this.finish();

在 TabLayout 活动中

@Override
protected void onPostCreate(Bundle state) {
    super.onPostCreate(state);
    handleTab(getIntent());
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    handleTab(intent);
}


private void handleTab(Intent intent) {
    // init tabs
    final int tab = intent.getIntExtra(EXTRA_TAB_TO_OPEN, -1);
    if (tab != -1) {
        getTabHost().setCurrentTab(tab);
    }
}

【讨论】:

  • 解决方案 1:后退按钮应自动关闭 Tab2ListItemActivity 并且您可以在上次打开的选项卡打开的情况下返回上一个活动 我怀疑确实需要代码。或者,如果确实如此,则代码:当您启动 TabLayout Activity 时,您将 int 传递给 Intent,该 int 指示要打开哪个选项卡。然后 TabLayout 检索您从 Tab2ListItemActivity 传递的选项卡索引并打开它。
【解决方案2】:
  1. 为什么要覆盖“后退”按钮?我的意思是,让默认行为发生,然后按后退按钮将带您到上一个活动。

  2. 如果您真的想按照自己的方式进行操作,则需要在启动 TabLayout 活动之前设置 tab id,并在 onCreate() 内设置> 的 TabLayout 您需要检查 tab id 并启动相应的 ListActivity。 tab id is 1 by default,这就是为什么它总是把你带到Tab1ListActivity。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,但我使用这个解决方案解决了。

    TabSample.class

    public class TabSample extends TabActivity {
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            TabHost tabHost = getTabHost();      
    
          tabHost.addTab(tabHost.newTabSpec("tab1")
                  .setIndicator("OPT")
                  .setContent(new Intent(this, TabGroup1Activity.class)));
    
          tabHost.addTab(tabHost.newTabSpec("tab2")
                  .setIndicator("EDIT")
                  .setContent(new Intent(this, TabGroup2Activity.class)));
    
          tabHost.setCurrentTab(1); 
        }
    }
    

    TabGroup1Activity.class

    public class TabGroup1Activity extends TabGroupActivity{
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            startChildActivity("OptionsActivity", new Intent(this,OptionsActivity.class));
        }
    }
    

    OptionsActivity.class

    public class OptionsActivity extends Activity {
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.optionspage);
    
            Button back = (Button) findViewById(R.id.BackButton1);
            Button next = (Button) findViewById(R.id.NextButton1);
    
            OnTouchListener backListener = new OnTouchListener() {
                    public boolean  onTouch  (View  v, MotionEvent  event) {
                        if (event.getAction()==MotionEvent.ACTION_UP){
                            finish();
                        }
                        return false;
                    }
                };
    
            OnTouchListener nextListener = new OnTouchListener() {
                public boolean onTouch(View v, MotionEvent event) {
                     if (event.getAction()==MotionEvent.ACTION_UP){
                         Intent edit = new Intent(getParent(), EditActivity.class);
                        TabGroupActivity parentActivity = (TabGroupActivity)getParent();
                        parentActivity.startChildActivity("EditActivity", edit);
                        return true;
                     }
                     return false;
                }
            };
    
            back.setOnTouchListener(backListener);
            next.setOnTouchListener(nextListener);
        }
    }
    

    终于结束了TabGroupActivity.class,它保存了所有的stat实例。

    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>();
        }
    
      @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());
      }
    
      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()); 
          }    
      }
    
      @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);
      }
    
      @Override
      public boolean onKeyUp(int keyCode, KeyEvent event) {
          if (keyCode == KeyEvent.KEYCODE_BACK) {
              onBackPressed();
              return true;
          }
          return super.onKeyUp(keyCode, event);
      }
    
      public void  onBackPressed() {
          int length = mIdList.size();
          if ( length > 1) {
              Activity current = getLocalActivityManager().getActivity(mIdList.get(length-1));
              current.finish();
          }  
      }
    }
    

    这是一个很棒的解决方案,你可以试试这个。并进行适当的manifest 条目。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 2015-04-13
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多