问题:重新创建片段而不是使用标记片段

时间:2017-10-30 20:41:35

标签: android android-fragments

我正在尝试创建一个快速简单的应用程序来学习活动和片段的生命周期。制作片段时我遇到了一个问题:

    @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toast.makeText(this, "Activity is created", Toast.LENGTH_SHORT).show();
    Log.i("onCreate():","Activity is created");

    fm = getSupportFragmentManager();

    Button button = (Button) findViewById(R.id.toMainFragment);
    button.setOnClickListener(new View.OnClickListener() {
        Fragment fragment = fm.findFragmentByTag(MAIN);
        @Override
        public void onClick(View view) {
            if(fragment == null) {
                FragmentTransaction transaction = fm.beginTransaction();
                transaction.replace(R.id.content, new MainFragment(), MAIN).addToBackStack(null).commit();
            }else{
                Toast.makeText(getApplicationContext(), "Fragment already created", Toast.LENGTH_SHORT).show();
                Log.i("onCreate():","Fragment Already created");
            }
        }
    });

    if (savedInstanceState != null){
        Toast.makeText(this, "Activity restored data", Toast.LENGTH_SHORT).show();
        Log.i("onCreate():","Activity restored data");
    }
}

每次按下按钮都会创建一个新片段,即使我设置了标签。为什么这不起作用?

编辑:我不理解对我的帖子的反对票。我正在为stackoverflow中的社区做一个简单的问题,因此我没有需要大的解释,我需要理解的是为什么我的变量片段一直显示为null,即使我将我的标签设置为MAIN

1 个答案:

答案 0 :(得分:1)

这行代码放错地方了:

Fragment fragment = fm.findFragmentByTag(MAIN);

您在onClick()方法之外使用它,这意味着fragment的值确定一次(当您创建/分配OnClickListener时),然后每次按钮重复使用点击。

只需在onClick()方法中移动该行:

    @Override
    public void onClick(View view) {
        Fragment fragment = fm.findFragmentByTag(MAIN);
        if(fragment == null) {
            FragmentTransaction transaction = fm.beginTransaction();
            transaction.replace(R.id.content, new MainFragment(), MAIN).addToBackStack(null).commit();
        }else{
            Toast.makeText(getApplicationContext(), "Fragment already created", Toast.LENGTH_SHORT).show();
            Log.i("onCreate():","Fragment Already created");
        }
    }