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

问题描述 投票:0回答:4

我在我的应用程序中使用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();
}
android android-fragments android-dialogfragment
4个回答
0
投票

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


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是否被解雇,如果它只是重​​新打开它。


0
投票

这是一个非常糟糕的做法。 Android并非旨在以这种方式运行。您需要在更改区域设置后重新配置布局。您可以显示一个对话框以关闭应用程序并重新启动它。这些将是标准的方法。


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);
© www.soinside.com 2019 - 2024. All rights reserved.