【问题标题】:addToBackStack() duplicating original fragment when pressing back buttonaddToBackStack()按下后退按钮时复制原始片段
【发布时间】:2015-04-20 00:30:59
【问题描述】:

每当我按下应用程序的后退按钮时,都会发生以下情况。

原创 手机显示:FragA

点击 FragA 上的视图后 手机显示:FragB

点击返回按钮后 手机显示: 片段A 片段A

我不知道为什么 FragA 被重新创建,而是在按下后退按钮时添加到前一个 FragA 的末尾。下面是我的代码。

public class ColorListFragment extends ListFragment {
private List<ColorGD> mDrawableList = null;
private ColorAdapter mAdapter = null;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_color_list, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState){

    super.onActivityCreated(savedInstanceState);
        populateList();
        getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            ColorGD viewItem = mDrawableList.get(position);
            float[] hues = {viewItem.getColor(0),viewItem.getColor(1)};

            Bundle args = new Bundle();
            final String hueValues = "hues";
            args.putFloatArray(hueValues,hues);

            SaturationListFragment sLF = new SaturationListFragment();
            sLF.setArguments(args);

            FragmentManager manager = getFragmentManager();
            FragmentTransaction transaction = manager.beginTransaction();
            transaction.replace(R.id.container,sLF);
            transaction.addToBackStack(null);
            transaction.commit();
        }
    });
}

我的主要活动有以下内容

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    addListFragment();
 }

  public void addListFragment(){
    ColorListFragment cLF = new ColorListFragment();
    FragmentManager manager = getFragmentManager();
    FragmentTransaction transaction = manager.beginTransaction();
    transaction.add(R.id.container,cLF);
    transaction.commit();
  }
}

【问题讨论】:

  • 显示的是 2 个 FragA 一个 FragA 直接跟在另一个 FragA 之后。
  • 你能用这些更新编辑你原来的帖子吗?
  • 请求的编辑已完成!

标签: android transactions android-listfragment


【解决方案1】:

我想我明白这里发生了什么。 Fragment 实际上不可能只用一个视图容器来复制。

我怀疑您的ListFragment 中的项目由于在onActivityCreated() 中调用populateList() 而被重复。

因为每次点击后退按钮从SaturationListFragment返回ColorListFragment时都会调用onActivityCreated(),所以每次都调用populateList()。见documentation here

为了解决您的问题,只需将调用populateList() 移动到onCreate(),这只会在ListFragment 第一次初始化时调用:

public class ColorListFragment extends ListFragment {
  private List<ColorGD> mDrawableList = null;
  private ColorAdapter mAdapter = null;

  //add the onCreate() override
  @Override
  public void onCreate(Bundle savedInstance){
      super.onCreate(savedInstance);
      populateList();  //add this here
  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
      return inflater.inflate(R.layout.fragment_color_list, container, false);
  }

  @Override
  public void onActivityCreated(Bundle savedInstanceState){
      super.onActivityCreated(savedInstanceState);
      //populateList();  //remove this
      //..................

【讨论】:

  • 谢谢,这就是问题所在!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
相关资源
最近更新 更多