【问题标题】:Android: Basic Dialog ImplementationAndroid:基本对话框实现
【发布时间】:2015-07-21 19:47:40
【问题描述】:

我已经搜索并找到了很多关于这个问题的不同答案,但没有什么能完全解决我的问题。 Total android n00b, 还请您耐心等待。

I'm having trouble dealing with a FileChooser problem with Android KitKat. As per [here][1], and according to [Steve N][2] i get the impression that this file chooser problem is caused by my android version (4.4.2)

鉴于文件选择器不起作用,我想实现一个基本对话框。我将检查设备的 android 版本号,然后显示一条消息,指出当前缺乏支持,如果版本号返回前面带有 4.4。

目前我只是用toast

public boolean checkVersionSupport(){
    if (Build.VERSION.RELEASE.equals("4.4.2") {
        Toast toast = Toast.makeText(context, androidOS, duration);
        toast.show();
    }
}

我想要一个简单的单按钮对话框,而不是 toast,它带有一个 OK 按钮,我将使用它来将用户重定向到本机应用程序并关闭到 chrome,其中整个文件选择器的东西似乎工作正常。

在阅读了 android 开发者资料后,我发现一些困难的事情。

  1. 我需要对话框的布局 XML 文件吗?

  2. 我应该将我正在创建的 MyAlertDialogFragment 类的类文件放在哪里?它可以在 java 文件夹中的任何位置,还是必须在子文件夹 java/com.myproject 中...这对将类导入我的 java 活动文件有什么影响?

  3. 谁能解释一下 Android 开发者资料中 FragmentAlertDialog 的来源。

    public static class MyAlertDialogFragment extends DialogFragment {
    
    public static MyAlertDialogFragment newInstance(int title) {
        MyAlertDialogFragment frag = new MyAlertDialogFragment();
        Bundle args = new Bundle();
        args.putInt("title", title);
        frag.setArguments(args);
        return frag;
    }
    
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        int title = getArguments().getInt("title");
    
        return new AlertDialog.Builder(getActivity())
                .setIcon(R.drawable.alert_dialog_icon)
                .setTitle(title)
                .setPositiveButton(R.string.alert_dialog_ok,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((**FragmentAlertDialog**)getActivity()).doPositiveClick();
                        }
                    }
                )
                .setNegativeButton(R.string.alert_dialog_cancel,
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            ((**FragmentAlertDialog**)getActivity()).doNegativeClick();
                        }
                    }
                )
                .create();
      }
    }
    
  4. 图标的最佳做法是什么?我看到关于这个的辩论正在进行,但是为了在对话框顶部有一个图标的简单目的,对于一个单一的基本用法,完成它的最快方法是什么?我只是将文件复制到 res 文件夹并引用它们... 48dp?这可能是一个完全不同的问题。

【问题讨论】:

  • 如果你想要一个文件选择器,你应该查看一些已经存在的库的源代码,它们很有用——这个对我来说特别有趣:github.com/spacecowboy/NoNonsense-FilePicker
  • 我并没有过度推动文件选择器工作。我很高兴暂时不支持该版本的android。如果我的移动提供商继续发布棒棒糖版本,那么我会重新访问,但我预计很快就会推出更新。但是谢谢!我很欣赏为解决显然是更大的问题所做的努力。不幸的是,这是我一直坚持的对话框实现的更简单的问题。

标签: java android android-dialogfragment


【解决方案1】:

我需要对话框的布局 XML 文件吗?

这实际上取决于您使用哪种类型的对话框。

  • AlertDialog 不需要指定布局,您只需使用AlertDialog.Builder() 并设置正/负按钮,以及它如何处理。

  • DialogFragment onCreateDialog() 方法是使用AlertDialog 的首选方法。它也不需要 XML 布局,但因此,它的布局本质上仍然仅限于 Yes/No 选项:look here for complete example

  • DialogFragment onCreateView() 方法允许您从指定的布局 XML 创建对话框。所以如果你想自定义对话框的视图超出“title, description, yes/no”,那么是的,你需要为对话框片段指定XML文件,看here for an example,虽然建议说您应该研究 ButterKnife 和 Otto 库以使其变得更好。

我将创建的 MyAlertDialogFragment 类的类文件放在哪里?它可以在 java 文件夹中的任何位置,还是必须在子文件夹 java/com.myproject 中...这对将类导入我的 java 活动文件有什么影响?

项目内的任何地方。虽然我更喜欢把它放在像 <projectroot>/presentation/fragments/dialog 这样的东西里。

谁能解释一下 Android 开发者资料中 FragmentAlertDialog 的来源。

FragmentAlertDialog 是一个假定的Activity,从中显示了MyAlertDialogFragment 对话框片段,并且假定具有doPositiveClick()doNegativeClick() 方法。提供的title int 很可能是/res/values/strings.xml 中定义的字符串资源,用于本地化。例如,R.string.fancy_title_name

原来是这样的

public class FragmentAlertDialog extends AppCompatActivity {
    @Override
    public void onCreate(Bundle saveInstanceState) {
        super.onCreate(saveInstanceState);
        setContentView(R.layout.activity_fragment_alert_dialog);
        //stuff
    }

    @Override
    public void onPostResume() {
        MyAlertDialogFragment madf = MyAlertDialogFragment.newInstance(R.string.something);
        madf.show(getSupportFragmentManager(), "alert-dialog-fragment");
    }
}

否则,MyAlertDialogFragment 只是从DialogFragment 扩展并覆盖onCreateDialog 以在此DialogFragment 内创建AlertDialog

如果您要问,newInstance() 方法是这样您就不会使用参数化构造函数。片段不应该有参数化的构造函数,它们应该在setArguments(Bundle) 方法中接收数据。

图标的最佳做法是什么?

请参阅material design guidelines

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-18
    • 2017-06-05
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多