1

我有一个类“bancoActivity”,它扩展了 Fragment 实现了 ActionBar.TabListener,它调用了另一个类“pagamentos”,扩展了 Fragment 实现了 ActionBar.TabListener。当我在课堂上“pagamentos”并单击物理按钮“返回”时,没有任何反应,当我再次单击应用程序时,应用程序完成。我把我的代码留在那里,以便你分析。奥布里加多。

bancoActivity的一部分:

@Override
public void onItemClick(AdapterView<?> customviewadapter, View view, int position, long id) {   
    listViewItem item = items.get(position);
    String Titulo = item.Title;

    if(Titulo.equals("Pagamentos")) {
        FragmentManager fragmentManager2 = getFragmentManager();
        FragmentTransaction fragmentTransaction2 = fragmentManager2.beginTransaction();
        pagamentos fragment2 = new pagamentos();
        fragmentTransaction2.hide(bancoActivity.this);
        fragmentTransaction2.add(android.R.id.content, fragment2);
        fragmentTransaction2.addToBackStack("banco");
        fragmentTransaction2.commit();
    }
}

pagamentos 的一部分:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
     getActivity().setContentView(R.layout.pagamentos);
     FragmentManager fm = getFragmentManager();

这两项活动扩展并实施:

public class pagamentos extends Fragment implements ActionBar.TabListener{
public class bancoActivity  extends Fragment implements ActionBar.TabListener
4

1 回答 1

0

我也是新手,但我会尝试一下...

我认为您需要从包含它们的活动中实例化两个片段,并使用 1 个片段管理器进行切换。如果没有你的整个代码,我很难说,但我有一个类似的设置工作,这里是如何:

public class MainActivity extends Activity implements ActionBar.TabListener {

    public static final int SEARCH_FRAG = 1;
public static final int MAP_FRAG = 2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    fragMan = (FragmentManager) getFragmentManager();
    mapFrag = ExtendedMapFragment.newInstance();
    searchFrag = SearchFragment.newInstance();
    if (mapShown == false) {
        swapFrags(SEARCH_FRAG);
    } else {
        swapFrags(MAP_FRAG);
    }
     ActionBar actionBar = getActionBar();
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
     actionBar.setDisplayShowTitleEnabled(true);
     searchTab = actionBar.newTab()
                .setText(R.string.search_tab_label)
                .setTabListener(this);
        actionBar.addTab(searchTab);
     mapTab = actionBar.newTab()
             .setText(R.string.map_tab_label)
             .setTabListener(this);
        actionBar.addTab(mapTab);
     if (savedInstanceState != null) {
         actionBar.setSelectedNavigationItem(savedInstanceState.getInt("currentTab"));
     }
     actionBar = null;

}

    public void swapFrags(int whatFrag) {
    if (whatFrag == SEARCH_FRAG) {
        //switch to frag 1, ie searchFrag
        FragmentTransaction trans = fragMan.beginTransaction();
        trans.replace(R.id.map, searchFrag);
        mapShown = false;
        trans.addToBackStack(null);
        trans.commit();
    }
    if (whatFrag == MAP_FRAG) {
        //switch to frag 2, ie mapFrag
        if (lbServ != null) {
            update.autoCenter(lbServ.getCurrentLatLng());
        }
        FragmentTransaction trans = fragMan.beginTransaction();
        trans.replace(R.id.map, mapFrag);
        mapShown = true;
        trans.addToBackStack(null);
        trans.commit();
    }
}

}

swapFrags() 方法也是从我的 onTabSelected 回调中调用的。我认为,因为我只有一个片段管理器,并且同一个管理器正在调用所有 addToBackStack() 方法,所以它更有条理。当我打开应用程序时,选择一个新标签,然后按物理返回键,它会回到上一个标签,这就是你想要的,不是吗?

我发现使用片段难以学习的一件事是所有调用、键等都首先进入活动。在片段上按下一个按钮,持有它的活动首先获得回调(无论它是否使用它),然后如果片段中有一个监听器,它也会得到调用,但片段不能在外面做任何事情本身,并且片段事务涉及片段之外的对象。

我想你可以在片段和活动之间设置一个接口,在活动中使用像 swapFrags() 这样的方法,片段可以要求交换,我认为这也应该这样做。

于 2013-05-30T17:45:56.953 回答