使用Activity Group在选项卡之间切换时,如何显示最后一个活动 - 选项卡ActivityGroup

3

我已经为我的Android应用编写了选项卡。

我的问题是,在使用活动组切换选项卡时,它希望显示最后一个活动。我想在导航选项卡时显示上次打开/访问的屏幕。我想要展示上一次打开的屏幕而不是回到第一个屏幕:

我需要在通过选项卡导航时显示上次打开的屏幕

选项卡 1 -> 销售。其中包含10个屏幕(活动) 选项卡 2 -> 管理员。其中包含5个屏幕(活动) 选项卡 3 -> 设置。其中包含8个屏幕(活动)

我点击选项卡1,它会加载包含销售路线列表的选项卡1的屏幕。然后我单击其中一个销售路线,它会跳转到第一个选项卡中零售商列表。然后我单击选项卡3“设置”,完成一些工作后返回到销售界面,此时它应该显示“销售”选项卡中上次打开的屏幕。

当我点击选项卡时,它应该显示上一次打开的活动如何做到呢?

我像这样做。请指出我要更改代码以满足我的需求。

MainActivity。登录后将调用它

  public class MainActivity extends TabActivity {
int selectedTab;
TabHost tabHost ;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tabview);

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

    TabSpec firstTabSpec = tabHost.newTabSpec("tid1");
    TabSpec secondTabSpec = tabHost.newTabSpec("tid1");
    TabSpec thirdTabSpec = tabHost.newTabSpec("tid1");
    /** TabSpec setIndicator() is used to set name for the tab. */
    /** TabSpec setContent() is used to set content for a particular tab. */
    firstTabSpec.setIndicator("Sales").setContent(new Intent(this,SalesActivityGroup.class));
    secondTabSpec.setIndicator("Admin").setContent(new Intent(this,SettingActivityGroup.class));
    thirdTabSpec.setIndicator("Setting").setContent(new Intent(this,SettingActivityGroup.class));


    tabHost.addTab(firstTabSpec);
    tabHost.addTab(secondTabSpec);
    tabHost.addTab(thirdTabSpec);
    tabHost.setCurrentTab(0);
    tabHost.setMinimumHeight(25);
}

public void onTabChanged(String arg0) {
        selectedTab = tabHost.getCurrentTab();

}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(false);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

首选项卡1(销售)的销售小组活动

 public class SalesActivityGroup extends ActivityGroup {

public static SalesActivityGroup group;
private ArrayList<View> history;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.history = new ArrayList<View>();
    group = this;

    View view = getLocalActivityManager().startActivity("Sales",
            new Intent(this, SalesRouteActivity.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP))
            .getDecorView();

    replaceView(view);

}

public void replaceView(View v) {
    history.add(v);
    setContentView(v);

}

public void back() {
    if (history.size() > 0) {
        history.remove(history.size() - 1);
        if (history.size() > 0) {
            setContentView(history.get(history.size() - 1));
        } else {
            finish();
        }
    } else {
        finish();
    }
}

@Override
public void onBackPressed() {
    SalesActivityGroup.group.back();
    return;
}

编辑 这是FirstTab的第一个活动 - SalesRouteActivity

    public class SalesRouteActivity extends ListActivity{
     TableLayout tl;
     static int positions = 0;
     static String keyword ="";
     int uploadSize = 0;
     private NotificationManager mNotificationManager;
     private int SIMPLE_NOTFICATION_ID;
     String strBusinessUnit = "";   
     String strExecutive = "";
     String strTerritoryCode = "";
     SimpleAdapter sd;
     View row = null;
     View selectRow = null;

     @Override
     public void onCreate(Bundle savedInstanceState) {

         super.onCreate(savedInstanceState);
         setContentView(R.layout.sales_routes);

         SharedPreferences myPrefs = this.getSharedPreferences("myLogedPrefs",MODE_WORLD_READABLE);
         strBusinessUnit = myPrefs.getString("BusinessUnit", "");
         strExecutive = myPrefs.getString("Executive", "");
         strTerritoryCode = myPrefs.getString("TerritoryCode", "");

         ArrayList<SalesRoutes> routeList = getSalesRoute();

         ArrayList<HashMap<String, String>> routhPath = new ArrayList<HashMap<String, String>>();
         for (int i = 0; i < routeList.size(); i++) {
            if(Integer.parseInt(routeList.get(i).getOutlets()) >0){
                HashMap<String, String> map = new HashMap<String, String>();
                map.put("routeCode",((SalesRoutes) routeList.get(i)).getRouteCode());
                map.put("routeName",((SalesRoutes) routeList.get(i)).getDescription());
                map.put("outlets", ((SalesRoutes) routeList.get(i)).getOutlets());
                routhPath.add(map);
             }
         }

         ListView list = getListView();
         sd = new SimpleAdapter(this, routhPath, R.layout.route_path,new String[] {"routeCode","routeName","outlets" },new int[] { R.id.routeCode,R.id.routeName,R.id.outlets});
         row = getLayoutInflater().inflate(R.layout.route_path_row, null, false);
         getListView().addHeaderView(row);
         list.setAdapter(sd);
         list.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        list.setSelected(true);
        list.setTextFilterEnabled(true);
        list.setItemsCanFocus(true);
        list.setItemChecked(positions, true);
        list.setSelectionAfterHeaderView();

        if (routeList.size() > 0) {
            keyword = routeList.get(0).getRouteCode();
        }

        uploadSize = new UploadActivity().getUploadTable();

        if (uploadSize > 0) {
            mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            final Notification notifyDetails = new Notification(R.drawable.icon, "New Alert, Click Me!",System.currentTimeMillis());
            Context context = getApplicationContext();
            CharSequence contentTitle = "Upload Available...";
            CharSequence contentText = "Browse Android Official Site by clicking me";
            Intent notifyIntent = new Intent(android.content.Intent.ACTION_VIEW,Uri.parse("http://www.android.com"));
            PendingIntent intent = PendingIntent.getActivity(SalesRouteActivity.this, 0, notifyIntent,android.content.Intent.FLAG_ACTIVITY_NEW_TASK);
            notifyDetails.setLatestEventInfo(context, contentTitle,contentText, intent);
            mNotificationManager.notify(SIMPLE_NOTFICATION_ID, notifyDetails);
        }
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);
        HashMap<String, String> hashMap = (HashMap<String, String>) l.getItemAtPosition(position);
        keyword = hashMap.get("routeCode");

        positions = position;
        if(position == 0 ){


        }else if(position != 1){
            Intent showContent = new Intent(v.getContext(),SalesRouteDevitionActivity.class);
            Bundle bundle = new Bundle();
            bundle.putString("RouteCode", keyword);
            showContent.putExtras(bundle);
            getParent().startActivityForResult(showContent, 5);
        }else{
            Intent intent = new Intent(SalesRouteActivity.this, ListRetailerActivity.class);
            Bundle bundle = new Bundle();
            bundle.putString("RouteName", keyword);
            intent.putExtras(bundle);
            View view = SalesActivityGroup.group.getLocalActivityManager().startActivity("", intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();  
            SalesActivityGroup.group.replaceView(view);

        }
    }

    @Override  
    public void onBackPressed() {  
        SalesActivityGroup.group.back();  
    } 

    @SuppressWarnings({ "rawtypes", "unchecked" })
    public ArrayList<SalesRoutes> getSalesRoute(){
         DBAdapter dbAdapter = DBAdapter.getDBAdapterInstance(this);
          try {
              dbAdapter.createDataBase();
         } catch (IOException e) {
              Log.i("*** select ",e.getMessage());
         }
         dbAdapter.openDataBase();       
         String sql = "SELECT RouteCode, Description, OutletsAttached  " +
                       "FROM WMRoute  " +
                       "WHERE ActiveStatus = '1' AND  RouteDefaultExecutive = ? AND  BusinessUnit = ? AND TerritoryCode = ?  " +
                       "ORDER BY RouteCode  ";

         String[]d = new String[]{strExecutive,strBusinessUnit,strTerritoryCode};
         ArrayList stringList = dbAdapter.selectRecordsFromDBList(sql, d);
         dbAdapter.close();
         ArrayList<SalesRoutes> salesRoutesList = new ArrayList<SalesRoutes>();
         for (int i = 0; i < stringList.size(); i++) {
            ArrayList<Object> arrayList = (ArrayList<Object>) stringList.get(i);
            ArrayList<Object> list = arrayList;
            SalesRoutes salesRoutes = new SalesRoutes();
            try {
                salesRoutes.setRouteCode((String) list.get(0));
                salesRoutes.setDescription((String) list.get(1));
                salesRoutes.setOutlets((String)list.get(2));

            } catch (Exception e) {
                Log.i("***" + SalesRouteActivity.class.toString(), e.getMessage());
            }
            salesRoutesList.add(salesRoutes);
        }
        return salesRoutesList;
    }
}

当您在选项卡之间切换时,我的ActivityGroups可能会被不断创建,因此我希望这些组只创建一次,并在切换选项卡时恢复

所有屏幕的详细信息/内容都从数据库获取。

我已经遇到这个问题超过2天了...请帮帮我。 请在这方面给我帮助...

提前感谢...


嘿,我已经更新了并在问题中提到了所有内容... - Piraba
@Nagkeeran Piraba,你能进入休闲聊天室吗?这样我就可以帮助你解决问题了。 - Lalit Poptani
为什么需要 onTabChanged() 方法?你在哪里使用 int selectedTab - Vaibhav Jani
6个回答

4

我认为你需要在activity-group中打开的每个活动中重写onBackPressed()

请在下面的每个活动中编写以下代码:

@Override  
public void onBackPressed() {  
       SalesActivityGroup.group.back();  
} 

还需将 TABHOST 中的 onBackPressed() 替换为以下代码:

@Override
public void onBackPressed() {
    super.onBackPressed();
}

祝你好运


这个方法需要在SalesGroupActivity或MainActivity中编写吗?@Override public void onBackPressed() { super.onBackPressed(); } - Piraba

4
你创建的活动组将保持当前活动视图不变,除非你更改它。因此,在你在选项卡之间导航时,你为这些选项卡分配的活动组将不会更改其视图,视图将保持不变。
你可以尝试以下方法...
对于每个你的活动,你必须重写onBackPressed()函数...
@Override  
public void onBackPressed() {  
       ActivityGroupRelatedToThisActivity.group.back();  
} 

请记住,在任何与活动组相关的活动中,不要调用super.onBackPressed()

或者

private ArrayList<View> history更改为static private ArrayList<View> history

并且

if(history.size() == 0) replaceView(view); 

ActivityGrouponCreate()方法中。

嗨!!调用活动应该像这样调用@Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); HashMap<String, String> hashMap = (HashMap<String, String>) l.getItemAtPosition(position); if(position != 1){ Intent showContent = new Intent(v.getContext(),SalesRouteDevitionActivity.class); Bundle bundle = new Bundle(); bundle.putString("RouteCode", keyword); showContent.putExtras(bundle); getParent().startActivityForResult(showContent, 5); } }然后重写onBackPressed()是吗? - Piraba
请在问题中发布你的这段代码(这样它会更易读,也有助于我们理解你的问题)。是的,你必须在每个在Activity组中的活动中重写onBackPressed()方法。 - Vaibhav Jani
我已经更新了上面的代码,请查看一下。您能否来聊天一会儿,讨论一下这个问题? - Piraba

1

不,这对我没有帮助。请告诉我我的代码有什么问题?我想要纠正的只是那个问题,其他方面都正常。 - Piraba
1
你必须详细调试你的代码。检查一下 ArrayList<View> history size() 视图,检查 onCreate() 是否被调用。检查 back() 方法是否为调试器。 因为代码看起来很好。 - Arslan Anwar

1

我认为您在ActivityGroup的back()方法中遇到了问题,请尝试这样做。

public void back()
{
    if ( history.size() > 1 )
    {
       history.remove(history.size() - 1);
       View v = arrList.get(history.size() - 1);
       setContentView(v);
    }
    else {
       this.finish();
    }
}

1

感谢大家;

我的MainActivity出现了问题。

 tabHost = getTabHost();
    TabHost.TabSpec spec;
    Intent intent;


    intent = new Intent().setClass(this, SalesActivityGroup.class);  
    spec = getTabHost().newTabSpec("Sales").setIndicator("Sales",getResources().getDrawable(R.drawable.ic_tab_artists_grey)).setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, SettingActivityGroup.class);  
    spec = getTabHost().newTabSpec("Admin").setIndicator("Admin",getResources().getDrawable(R.drawable.admin)).setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, SettingActivityGroup.class);  
    spec = getTabHost().newTabSpec("Setting").setIndicator("Setting",getResources().getDrawable(R.drawable.ic_tab_artists_grey)).setContent(intent);
    tabHost.addTab(spec);

    intent = new Intent().setClass(this, SettingActivityGroup.class);  
    spec = getTabHost().newTabSpec("Inquiry").setIndicator("Inquiry",getResources().getDrawable(R.drawable.ic_tab_artists_grey)).setContent(intent);
    tabHost.addTab(spec);


    tabHost.setCurrentTab(0);
    tabHost.setMinimumHeight(18);
    tabHost.setFadingEdgeLength(5);
    tabHost.setFocusable(true); 
    tabHost.requestFocus();
    tabHost.setFadingEdgeLength(5);
  }
}

我同意 @Vaibhav Jani @Dharmendra @Suri 的观点,我在所有的Activity中都错过了onKeyPressed()。


0

我看到了你的更新。我不确定如何回答你的问题。也许你可以在onSavedInstanceState中保存当前显示的视图信息,并在onRestoreInstancestate中获取数据并用它来重新创建视图。另外,ActivityGroup已经被弃用,现在已经被Fragment API所取代。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接