Android ICS 4.0.3上的ActionBar和片段

Android ICS 4.0.3上的ActionBar和片段,android,android-actionbar,actionbarsherlock,fragment,Android,Android Actionbar,Actionbarsherlock,Fragment,我正在尝试开发一个Android应用程序,但ActionBar有一些问题 我需要一些类似Instagram或Android版Twitter的东西:我有一个带有3个标签的操作栏,这些标签上有一些按钮;每个按钮都有一个OnClick,它用一个新的片段替换实际片段,例如FragmentN usingfragmenttransaction和replace方法 我的第一个问题是,当我从ActionBar中选择一个选项卡时,所选的选项卡不会替换FragmentN,但它会将自身置于顶部,因此我会继续看到两个片

我正在尝试开发一个Android应用程序,但ActionBar有一些问题

我需要一些类似Instagram或Android版Twitter的东西:我有一个带有3个标签的操作栏,这些标签上有一些按钮;每个按钮都有一个OnClick,它用一个新的片段替换实际片段,例如FragmentN usingfragmenttransaction和replace方法

我的第一个问题是,当我从ActionBar中选择一个选项卡时,所选的选项卡不会替换FragmentN,但它会将自身置于顶部,因此我会继续看到两个片段,一个在另一个之上

我还有另一个问题,但我认为这与前面的问题有关……不过我用一个例子来解释。 我从操作栏中选择选项卡A,然后在此选项卡中按下按钮3,使FragmentA3替换FragmentA。之后,我从ActionBar中选择tabC。 现在,我总是从ActionBar中再次选择选项卡A,但我没有再次看到FragmentA,而是看到了我之前选择的FragmentA3

如何解决这些问题? 多谢各位

编辑:这是我的代码

主要活动

    import android.os.Bundle;
    import android.annotation.SuppressLint;
    import android.annotation.TargetApi;
    import android.app.ActionBar;
    import android.app.ActionBar.Tab;
    import android.app.Activity;
    import android.app.Fragment;
    import android.app.FragmentTransaction;


    @SuppressLint("NewApi")
    @TargetApi(11)
    public class ABActivity extends Activity {
@Override
     public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ActionBar actionBar = getActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    //TAB 1
    Tab tab = actionBar.newTab(); 
    tab.setIcon(R.drawable.p);
    String label1 = "one";
    TabListener<Tab1Fragment> tl1 = new TabListener<Tab1Fragment>(this,
            label1, Tab1Fragment.class);
    tab.setTabListener(tl1);
    actionBar.addTab(tab);

    //TAB2
    tab = actionBar.newTab(); 
    tab.setIcon(R.drawable.m);
    String label2 = "two";
    TabListener<Tab2Fragment> tl2 = new TabListener<Tab2Fragment>(this,
            label2, Tab2Fragment.class);
    tab.setTabListener(tl2);
    actionBar.addTab(tab);

    //TAB3       
    tab = actionBar.newTab(); 
    tab.setIcon(R.drawable.s);
    String label3 = "three";
    TabListener<Tab3Fragment> tl3 = new TabListener<Tab3Fragment>(this,
            label3, Tab3Fragment.class);
    tab.setTabListener(tl3);
    actionBar.addTab(tab);
     }

   private class TabListener<T extends Fragment> implements   ActionBar.TabListener {
  private Fragment mFragment;
  private final Activity mActivity;
  private final String mTag;
  private final Class<T> mClass;

  public TabListener(Activity activity, String tag, Class<T> clz) 
  {
      mActivity = activity;
      mTag = tag;
      mClass = clz;
  }

  public void onTabSelected(Tab tab, FragmentTransaction ft) 
  {
     if (mFragment == null) {
          mFragment = Fragment.instantiate(mActivity, mClass.getName());
          ft.add(android.R.id.content, mFragment, mTag);
      } else {
          ft.attach(mFragment);
      }

      }

  public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
      if (mFragment != null) {
          ft.detach(mFragment);
      }
  }

  public void onTabReselected(Tab tab, FragmentTransaction ft) {
  }} }
诺瓦

tab1.xml

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tab1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">


<Button
    android:id="@+id/butt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button" />

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="one" />

    </LinearLayout>
nuova.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/nuovo"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical"
      android:gravity="center">

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="nuova" />
 </LinearLayout>

在更改选项卡时,在片段上的任何必要位置使用“分离”和“附加”方法。 比如说,

public void onTabSelected(Tab tab, FragmentTransaction ft) {
        if (mFragment == null) {
            mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
            ft.add(android.R.id.content, mFragment, mTag);
        } else {
            ft.attach(mFragment);
        }
    }

您可以在以下路径中看到Android示例中的完整源代码:Android sdk->samples->Android-16->ApiDemos->src->com->example->Android->API->app->FragmentTabs。java

在更改选项卡时,在片段上使用detach和attach方法(必要时)。 比如说,

public void onTabSelected(Tab tab, FragmentTransaction ft) {
        if (mFragment == null) {
            mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
            ft.add(android.R.id.content, mFragment, mTag);
        } else {
            ft.attach(mFragment);
        }
    }

您可以在以下路径中看到Android示例中的完整源代码:Android sdk->samples->Android-16->Apidmos->src->com->example->Android->API->app->FragmentTabs.java

在您的Tab1Fragment in onClick方法中,您可以用新创建的nuovo替换MFFragment实例

替换添加到容器中的现有片段。这本质上与为所有当前添加的片段调用removeFragment相同,这些片段是使用相同的ContainerWebID添加的,然后使用此处给出的相同参数调用addint、Fragment、String

看起来mFragment现在引用了另一个objectnuovo,但我可能错了-我明天会检查它

所以,首先更换这条线 transaction.replaceandroid.R.id.content,nuovo

然后使用以下代码修改AbsSelectedTab选项卡FragmentTransaction ft上的公共作废:

Fragment fr = getFragmentManager().findFragmentByTag("nuovoTag");
if (fr != null)
  ft.remove(fr);

  if (mFragment == null) {
      mFragment = Fragment.instantiate(mActivity, mClass.getName());
      ft.add(android.R.id.content, mFragment, mTag);
  } else {
      ft.attach(mFragment);
  }

在Tab1Fragment-In-onClick方法中,用新创建的nuovo替换MFFragment实例

替换添加到容器中的现有片段。这本质上与为所有当前添加的片段调用removeFragment相同,这些片段是使用相同的ContainerWebID添加的,然后使用此处给出的相同参数调用addint、Fragment、String

看起来mFragment现在引用了另一个objectnuovo,但我可能错了-我明天会检查它

所以,首先更换这条线 transaction.replaceandroid.R.id.content,nuovo

然后使用以下代码修改AbsSelectedTab选项卡FragmentTransaction ft上的公共作废:

Fragment fr = getFragmentManager().findFragmentByTag("nuovoTag");
if (fr != null)
  ft.remove(fr);

  if (mFragment == null) {
      mFragment = Fragment.instantiate(mActivity, mClass.getName());
      ft.add(android.R.id.content, mFragment, mTag);
  } else {
      ft.attach(mFragment);
  }

你应该发布一些代码。不幸的是,如果没有代码来检查唯一的答案,我该如何解决这些问题?是“修复你的代码”。你应该发布一些代码。不幸的是,如果没有代码来检查唯一的答案,我该如何解决这些问题?是“修复你的代码”。这正是我正在做的…我认为在TabListener中有一些东西需要修改,但我不知道是什么。我发布了我的代码!这正是我正在做的…我认为在TabListener中有一些东西需要修改,但我不知道是什么。我发布了我的代码!谢谢,但最后我用另一种方式修改了ontablisted,所以我解决了重叠问题第一个问题,但我还有第二个问题…我需要回到原始片段,但我找不到方法!这是我的onTabSelected public void onTabSelectedTab选项卡,FragmentTransaction ft{if-mFragment==null{mFragment=Fragment.InstanceActivity,mClass.getName;ft.addandroid.R.id.content,mFragment,mTag;}else{ifmFragment.getTag.equalsgetFragmentManager.findFragmentByIdandroid.R.id.content.getTag ft.showmFragment;else{ft.detachgetFragmentManager.findFragmentByIdandroid.R.id.content;如果MFFragment==null{MFFragment=Fragment.InstanceActivity,mClass.getName;ft.addandroid.R.id.content,MFFragment,mTag;}else ft.attachmFragment;}}谢谢,但最后我用另一种方式修改了onTabSelected,所以我解决了重叠问题第一个问题,但我还有第二个问题…我需要回到原始片段,但我找不到方法!这是我的onTabSelected public void onTabSelectedTab选项卡,FragmentTransaction ft{if-mFragment=
=null{MFFragment=Fragment.InstanceActivity,mClass.getName;ft.addandroid.R.id.content,mfFragment,mTag;}else{IFMFFragment.getTag.equalGetFragmentManager.findFragmentByIdandroid.R.id.content.getTag ft.showmFragment;else{ft.detachgetFragmentManager.findFragmentByIdandroid.R.id.content;如果MFFragment==null{MFFragment=Fragment.实例化活动,mClass.getName;ft.addandroid.R.id.content,MFFragment,mTag;}否则ft.attachmFragment;}}}
Fragment fr = getFragmentManager().findFragmentByTag("nuovoTag");
if (fr != null)
  ft.remove(fr);

  if (mFragment == null) {
      mFragment = Fragment.instantiate(mActivity, mClass.getName());
      ft.add(android.R.id.content, mFragment, mTag);
  } else {
      ft.attach(mFragment);
  }