【问题标题】:how to set initial fragment in frame using switch widget如何使用开关小部件在框架中设置初始片段
【发布时间】:2018-04-20 08:54:45
【问题描述】:

我正在使用 switch 来更改 android 中的片段,并且它成功了,但是我没有找到关于如何在框架中设置和显示初始片段的信息。

public class SwitchActivity extends AppCompatActivity {

Switch swCheck;

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

    swCheck = findViewById(R.id.switch_check);

    swCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {

            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction transaction = fragmentManager.beginTransaction();

            if (isChecked) {
                transaction.replace(R.id.content, new NewsFragment()).commit();
            } else {
                transaction.replace(R.id.content, new BoardFragment()).commit();
            }
        }
    });



}

}

【问题讨论】:

  • 最快的解决方案是在 Switch 上执行“点击”,例如 swCheck.performClick()

标签: android switch-statement fragment


【解决方案1】:

要替换片段,我使用这样的辅助方法:(我保留了后台堆栈,但每个片段类只有 1 个)

@Override
public void replaceCurrentFragment(Fragment fragment, String newTag) {

    invalidateOptionsMenu();
    String backStateName = fragment.getClass().getName();

    FragmentManager manager = getSupportFragmentManager();
    boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0);

    if (!fragmentPopped && manager.findFragmentByTag(newTag) == null) {
        //fragment not in back stack, create it.
        FragmentTransaction ft = manager.beginTransaction();
        ft.replace(R.id.flContainer, fragment, newTag);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        ft.addToBackStack(backStateName);
        ft.commit();
    }
}

我这样称呼它

    replaceCurrentFragment(new MenuFragment(), "yourTag");

你可以在你的 switch 和你的初始中使用这个方法,你的代码将如下所示:

public class SwitchActivity extends AppCompatActivity {

Switch swCheck;

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

    swCheck = findViewById(R.id.switch_check);

    swCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {

            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction transaction = fragmentManager.beginTransaction();

            if (isChecked) {
                replaceCurrentFragment(new NewsFragment(), "yourTag");
            } else {
                replaceCurrentFragment(new BoardFragment(), "yourTag2");
            }
        }
    });

    //to set the initial fragment, just use the replace again here in the oncreate:
    replaceCurrentFragment(new NewsFragment(), "yourTag");
  }

@Override
public void replaceCurrentFragment(Fragment fragment, String newTag) {

    invalidateOptionsMenu();
    String backStateName = fragment.getClass().getName();

    FragmentManager manager = getSupportFragmentManager();
    boolean fragmentPopped = manager.popBackStackImmediate(backStateName, 0);

    if (!fragmentPopped && manager.findFragmentByTag(newTag) == null) {
        //fragment not in back stack, create it.
        FragmentTransaction ft = manager.beginTransaction();
        ft.replace(R.id.content, fragment, newTag);
        ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
        ft.addToBackStack(backStateName);
        ft.commit();
    }
}
}

如果您不想使用该方法

public class SwitchActivity extends AppCompatActivity {

Switch swCheck;

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

    swCheck = findViewById(R.id.switch_check);

    swCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {

            FragmentManager fragmentManager = getSupportFragmentManager();
            FragmentTransaction transaction = fragmentManager.beginTransaction();

            if (isChecked) {
                transaction.replace(R.id.content, new NewsFragment()).commit();
            } else {
                transaction.replace(R.id.content, new BoardFragment()).commit();
            }
        }
    });
  transaction.replace(R.id.content, new BoardFragment()).commit();

}
}

希望对你有帮助

【讨论】:

  • @Muci 不客气,很高兴它对您的问题有所帮助 :)
猜你喜欢
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 2013-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-01
  • 2017-05-11
相关资源
最近更新 更多