【问题标题】:Android : Handle Locale on FragmentsAndroid:处理片段上的语言环境
【发布时间】:2014-07-16 06:42:20
【问题描述】:

我在我的应用程序中使用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();
}

【问题讨论】:

  • 我不明白你在问什么,“我如何使用新的语言环境配置保留对话框”是什么意思?
  • 用户通过按下导致对话框关闭的按钮来更改区域设置?对话框确实保留在那里,但是您想使用新的区域设置但它没有?您到底在哪里使用那个?
  • 在您的对话框中,您的显示内容取决于本地?如果整个对话文本依赖于本地,则必须重新启动它。
  • @XaverKapeller 我想用对话框显示片段,即使在用户更改区域设置后,使用新语言。
  • @421 那么有什么问题呢?你不能给我们看一些相关的代码吗?如果我们不知道您在做什么,应该如何帮助您?

标签: android android-fragments android-dialogfragment


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    首先,您应该问自己这是否是一个问题。用户很少更改他们的语言环境,如果他们这样做的话。因此,DialogFragment 在更改区域设置时被忽略似乎是一个相当小的问题。我不会担心的。


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

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

    @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 是否刚刚关闭以及是否刚刚重新打开。

    【讨论】:

    • 这段代码我试过了,但是语言没有更新,我很难在onConfigurationChanged中调用更新配置方法
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      请调用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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-30
        • 2016-08-20
        • 1970-01-01
        • 1970-01-01
        • 2022-12-10
        相关资源
        最近更新 更多