【问题标题】:How to edit a fragment and save its state?如何编辑片段并保存其状态?
【发布时间】:2013-03-17 23:05:29
【问题描述】:

当我单击按钮(按钮添加)时,我必须在 Fragment(Details())中添加 TextViewsEditTexts。 我能够插入它们,但是当我滑动我的 6 个片段并在第一个片段中返回时,这些项目消失了。

有人可以帮我吗?

FragmentActivity 类:

public class SubActivityTab extends FragmentActivity
{
    SectionsPagerAdapter spa;
    ViewPager vp;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.scrolltab_layout);

       spa = new SectionsPagerAdapter(getSupportFragmentManager(), this);

       vp = (ViewPager) findViewById(R.id.pager);
       vp.setAdapter(spa);
    }
}

FragmentPagerAdapter 类:

public class SectionsPagerAdapter extends FragmentPagerAdapter 
{   
    Context c;

    public SectionsPagerAdapter(FragmentManager fm, Context c) {
      super(fm);
      this.c = c;
    }

    @Override
    public Fragment getItem(int position) {
      switch(position)
      {
           case 0: 
           return Details.newInstance();
           ...
      }
      return null;
    }

    @Override
    public int getCount() {
    return 6;
    }

    @Override
    public CharSequence getPageTitle(int position) {
      Locale l = Locale.getDefault();
      switch (position) 
      {
         case 0:
        return c.getString(R.string.tab1).toUpperCase(l);
                 ...
      }
      return null;
   }    
}

片段类:

public final class Details extends Fragment {

    public static View layout;
    public static LinearLayout ll;

    public static Details newInstance()
    {       
      return new Details();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
       super.onCreateView(inflater, container, savedInstanceState);

       layout = inflater.inflate(R.layout.details, container, false);
       ll = (LinearLayout) layout.findViewById(R.id.linearlayout2);
       Button add = (Button) layout.findViewById(R.id.button_add);

       add.setOnClickListener(new OnClickListener(){

       @Override
       public void onClick(View v) {

       insertLine();
       insertClassEditText();
       insertLevel();
       }});

       return layout;
    }

    private void insertLine()
    { 
      View temp = (View) layout.findViewById(R.id.line);
      View v = new View(temp.getContext());
      v.setBackgroundColor(Color.rgb(209, 209, 209));
      v.setId(0);
      v.setLayoutParams(temp.getLayoutParams());
      ll.addView(v);

    }

    private void insertClassEditText()
    {
      TextView label_classe = (TextView) layout.findViewById(R.id.textView10);
      EditText edit_classe = (EditText) layout.findViewById(R.id.editText9);

      TextView new_label_classe = new TextView(label_classe.getContext()); 
      EditText new_edit_classe = new EditText(edit_classe.getContext());

      new_label_classe.setId(1);
      new_edit_classe.setId(2);

      new_label_classe.setText("Label");
      new_label_classe.setTextAppearance(new_label_classe.getContext(), android.R.style.TextAppearance_Medium);
      ll.addView(new_label_classe);

      new_edit_classe.setInputType(edit_classe.getInputType());
      new_edit_classe.setLayoutParams(edit_classe.getLayoutParams());
      ll.addView(new_edit_classe);

    }

    private void insertLevel()
    {
      TextView label_lv = (TextView) layout.findViewById(R.id.textView11);
      EditText edit_lv = (EditText) layout.findViewById(R.id.editText10);

      TextView new_label_lv = new TextView(label_lv.getContext());
      EditText new_edit_lv = new EditText(edit_lv.getContext());

      new_label_lv.setId(3);
      new_edit_lv.setId(4);

      new_label_lv.setText(label_lv.getText());
      new_label_lv.setTextAppearance(new_label_lv.getContext(), android.R.style.TextAppearance_Medium);
      ll.addView(new_label_lv);

      new_edit_lv.setInputType(edit_lv.getInputType());
      new_edit_lv.setLayoutParams(edit_lv.getLayoutParams());
      ll.addView(new_edit_lv);
    }
}

【问题讨论】:

    标签: android fragment android-fragmentactivity fragmentpageradapter


    【解决方案1】:

    我相信ViewPager 会在您滑动时回收视图,因此当您返回时,它会从onCreateView 重建。

    我建议设置一些标签并传递给onSaveInstanceState

    private void onSaveInstanceState(Bundle b) {
      if (label_classe != null) {
        b.putBoolean("label_classe", true);
      }
    }
    

    然后在onCreateView 中使用savedInstanceState,检查创建了哪些元素并重新创建它们。

    所以在片段中:

     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
      {
    
        ....
        if (savedInstanceState.getBoolean("label_classe")) {
           insertClassEditText();
        }
    
        ....
    }
    

    为了确定,在 Activity 中:

    public class SubActivityTab extends FragmentActivity
    {
        SectionsPagerAdapter spa;
        ViewPager vp;
    
        @Override
        public void onCreate(Bundle savedInstanceState)
        {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.scrolltab_layout);
    
           spa = new SectionsPagerAdapter(getSupportFragmentManager(), this);
    
           vp = (ViewPager) findViewById(R.id.pager);
           vp.setSaveState(true);
           vp.setSaveFromParentEnabled(true);
           vp.setAdapter(spa);
        }
    }
    

    【讨论】:

    • 感谢 Arturs 的回答,但我试过了,但没有用...同样的问题
    【解决方案2】:

    尝试将您的onCreateView 方法更改为:

     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    
        if(layout ==null){
           layout = inflater.inflate(R.layout.details, container, false); //Dont inflate every time.layout saved, data of layout,like EidtText also saved.
        }
    
        ViewParent parent = mLayout.getParent();
        if(parent!=null){
            ((ViewGroup)parent).removeView(layout);//the view will be add to NoSaveStateFrameLayout after onCreateView,so remove self everytime
        }
        return layout;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多