Android:处理片段上的区域设置

时间:2014-07-16 06:42:20

标签: android android-fragments android-dialogfragment

我在我的应用中使用FragmentsDialogFragments。我也想支持各种语言。当用户更改区域设置时,Fragment会相应更新。但是DialogFragment被驳回了!

我已经尝试了setRetainInstance(true);,但这会杀死活跃的对话框。

我的MainFragment

public class MainFragment extends Fragment implements OnClickListener {
    Button mButton;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_layout, container, false);
        mButton = (Button) v.findViewById(R.id.button1);
        mButton.setOnClickListener(MainFragment.this);
        return v;

    }

    void showDialog() {
        CustomDialog newFragment = CustomDialog.newInstance();
        newFragment.listner = new ISubmitListner() {

            @Override
            public void onButtonClick() {
                Toast.makeText(getActivity(), " OK pressed", Toast.LENGTH_LONG).show();
            }
        };
        newFragment.show(getFragmentManager(), "dialog");
    }

    @Override
    public void onClick(View v) {
        showDialog();
    }
}

我的CustomDialog

public class CustomDialog extends DialogFragment {
    ISubmitListner listner;

    public static CustomDialog getInstance(Bundle bundle) {
        CustomDialog dialog = new CustomDialog();
        dialog.setArguments(bundle);
        dialog.setCancelable(false);
        return dialog;
    }

    static CustomDialog newInstance() {
        return new CustomDialog();
    }

    private ProgressDialog mProgressDialog;

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        mProgressDialog = new ProgressDialog(getActivity());
        mProgressDialog.setView(new View(getActivity()));
        mProgressDialog.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        mProgressDialog.setCancelable(true);
        mProgressDialog.setTitle(getResources().getString(R.string.title));
        mProgressDialog.setMessage(getResources().getString(R.string.message));
        mProgressDialog.setProgressStyle(android.R.style.Theme_DeviceDefault_Light);
        mProgressDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT));
        mProgressDialog.setButton(DialogInterface.BUTTON_NEUTRAL, "OK", new OnClickListener() {

            @Override
            public void onClick(DialogInterface dialog, int which) {
                listner.onButtonClick();

            }
        });

        return mProgressDialog;
    }
}

我的ISubmitListner

public interface ISubmitListner {
    void onButtonClick();
}

4 个答案:

答案 0 :(得分:0)

我认为您需要重新实例化对话框,因为区域设置配置更改将重新启动活动,因此将删除活动上的所有对话框。

答案 1 :(得分:0)

首先,你应该问问自己这是否是一个问题。用户很少改变他们的语言环境。因此,在更改区域设置时DialogFragment被解除似乎是一个相当小的问题。我不担心。


但无论如何这里是一个解决方案:

覆盖onConfigurationChanged中的Fragment,如下所示:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}

每次用户更改配置时都会调用此方法。这可以更改区域设置或方向。您可以从Configuration对象获取有关新配置的信息:

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);

    final Locale locale = newConfig.locale;
    final int orientation = newConfig.orientation;
    ...
}

如果DialogFragment刚刚被解雇,并且刚刚重新打开它,您可以在那里办理登机手续。

答案 2 :(得分:0)

请在onCreate(){}

调用 changeAppLanguage(...)方法!

效果很好。

Resources resources = getContext().getResources();

DisplayMetrics metrics = resources.getDisplayMetrics();

Configuration configuration = resources.getConfiguration();

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
    configuration.setLocale(locale);
} else {
    configuration.locale = locale;
}
resources.updateConfiguration(configuration, metrics);

答案 3 :(得分:0)

这是非常不好的做法。 Android并非设计为以这种方式运行。更改语言环境后,您需要重新配置布局。您可以显示一个对话框来关闭应用程序并重新启动它。这些将是标准的方法。