【问题标题】:how to save data before fragment is recreate?如何在片段重新创建之前保存数据?
【发布时间】:2016-07-18 04:30:56
【问题描述】:

我尝试在片段子类中使用 onSaveInstanceState(Bundle outState) 方法保存数据。

说明: 我创建了一个类 FragmentA,它扩展了此类中的 Fragment 我有一个变量名称计数,当我单击按钮时计数的值会发生变化(最初计数 = 0)我想保存计数的值,即使方向改变(从纵向到横向或反之亦然) 。 我的 MainActivity 类动态加载片段。

我的代码:

这个类扩展了片段:-

public class FragmentA extends Fragment implements View.OnClickListener {
Button change_After_Click;
    int count=0;
    Communicator com;

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(savedInstanceState!=null){
            count=savedInstanceState.getInt("counter",0);
        }
    }

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

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        System.out.println("onActivityCreated");
        com= (Communicator) getActivity();
        change_After_Click=(Button)getActivity().findViewById(R.id.textChangeClick);
        change_After_Click.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

count=count+1;
        com.proviedLinkBothFragment("button click "+ count);
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putInt("counter",count);
    }
}

MainActivity 类在这里我动态加载片段:-

public class MainActivity extends AppCompatActivity implements Communicator {
Button btn;
    FragmentManager   fragmentManager;
    FragmentTransaction fragmentTransaction;
    FragmentB obj;
    FragmentA objA;

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

        System.out.println("ge low");


                    fragmentManager=getSupportFragmentManager();
                    fragmentTransaction=fragmentManager.beginTransaction();
                    fragmentTransaction.replace(R.id.relativeLayout,new FragmentA());

                    fragmentTransaction.commit();




    }



    @Override
    public void proviedLinkBothFragment(String s) {

           FragmentB fb= (FragmentB) fragmentManager.findFragmentById(R.id.relativeLayout);
        fb.changeText(s);


    }


}

【问题讨论】:

  • fragmentTransaction.replace(R.id.relativeLayout,new FragmentA()); 您每次都在放置一个新片段。您的保存/加载count 看起来不错,但是由于您要替换片段,所以您看不到它。您需要先检查片段是否已经存在。
  • @njzk2 能否请您给我代码以便我可以轻松理解。我是新人

标签: android android-fragments


【解决方案1】:

在活动的方法onCreate 中,您应该在替换之前检查片段是否已经存在。添加片段时,您应该为此片段使用标签(“MY_TAG”),稍后您可以通过标签找到片段。您不需要手动重新创建片段(我猜在旋转期间)。系统为你量身定做。

fragmentManager=getSupportFragmentManager();
if (fragmentManager.findFragmentByTag("MY_TAG") == null) {
    fragmentTransaction=fragmentManager.beginTransaction();
    fragmentTransaction.add(R.id.relativeLayout,new FragmentA(), "MY_TAG");

    fragmentTransaction.commit();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    相关资源
    最近更新 更多