Android 如何编辑片段并保存其状态?

Android 如何编辑片段并保存其状态?,android,fragment,android-fragmentactivity,fragmentpageradapter,Android,Fragment,Android Fragmentactivity,Fragmentpageradapter,当我点击按钮(button add)时,我必须在片段(Details())中添加TextView和EditText。 我能够插入它们,但当我滑动我的6个片段并返回第一个片段时,这些项目消失了 有人能帮我吗 碎片活动类: public class SubActivityTab extends FragmentActivity { SectionsPagerAdapter spa; ViewPager vp; @Override public void onCrea

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

有人能帮我吗

碎片活动类:

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);
    }
}
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);
    }
}
FragmentPagerAdapter类:

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);
    }
}
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);
    }
}
片段类:

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);
    }
}
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);
    }
}

我相信
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();
    }

    ....
}
可以肯定的是,在活动中:

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);
    }
}

尝试将您的
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;
}

谢谢Arturs的回答,但我试过了,但没有成功…同样的问题