在刷新Fragment时,会一次又一次地调用Android RadioGroup onCheckedChanged

时间:2017-02-14 14:55:10

标签: android android-fragments

我想为我的应用实现一个设置助手,当用户第一次启动应用时会显示该设置助手。我使用了一个PageViewer,看起来效果很好。

第一页询问用户默认语言。我想在用户从RadioGroup中选择语言时刷新页面。所以我需要一种方法来重新加载所选语言的片段。

public class SetupAssistantLanguageFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.setup_language_fragment, container, false);

        ((RadioGroup) view.findViewById(R.id.setup_language_radiogroup)).setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(RadioGroup radioGroup, int i) {
                String langcode = "";
                if (i == R.id.setup_fragment1_languagechooser_en) {
                    langcode = "en";
                } else {
                    langcode = "de";
                }

                ((SetupAssistantActivity) getActivity()).changeLanguage(langcode);
                SetupAssistantLanguageFragment.this.refreshView();
                System.out.println("test1");
            }
        });

        return view;
    }

    public void refreshView() {
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.detach(this).attach(this).commit();
        System.out.println("test2");
    }
}

更改语言有效但仅适用于第一页后面的页面。这是因为当语言改变时需要重新加载片段。我尝试在refreshView()中重新加载。

问题是:只要按下一个单选按钮,我就会得到无限循环打印" test1"和" test2"。为什么这种方法一次又一次地被调用?

如何重新加载片段一次?

1 个答案:

答案 0 :(得分:0)

我明白了:

在我的片段中,我首先保存当前语言。

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    currentDisplayLang = getResources().getConfiguration().locale.getLanguage();
}

在onCreateView中,我只在语言真正改变时刷新片段。

((RadioGroup) view.findViewById(R.id.lecture_translator_setup_language_radiogroup)).setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(RadioGroup radioGroup, int i) {
        String chosenLangcode = i == R.id.setup_fragment1_languagechooser_en ? "en" : "de";

        if (!chosenLangcode.equals(currentDisplayLang)) {
            currentDisplayLang = chosenLangcode.toString();
            ((SetupAssistantActivity) getActivity()).changeLanguage(chosenLangcode);
            SetupAssistantLanguageFragment.this.refreshView();
        }
    }
});

这是推荐的方式吗?