我在我的应用中使用Fragments
和DialogFragments
。我也想支持各种语言。当用户更改区域设置时,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();
}
答案 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并非设计为以这种方式运行。更改语言环境后,您需要重新配置布局。您可以显示一个对话框来关闭应用程序并重新启动它。这些将是标准的方法。