欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Spinner在Dialog中的使用效果

程序员文章站 2022-09-30 20:32:33
版权声明:本文为xing_star原创文章,转载请注明出处! 本文同步自http://javaexception.com/archives/91 背景: 记得很久以前,碰到一个需求场景,需要在Android Dialog中显示Spinner,用来进行选择操作。那个时候还很困惑,不知道是否可以这么搞。 ......

版权声明:本文为xing_star原创文章,转载请注明出处!

本文同步自

背景:

记得很久以前,碰到一个需求场景,需要在android dialog中显示spinner,用来进行选择操作。那个时候还很困惑,不知道是否可以这么搞。抱着试试看的心态,做起了实验,看起来效果还可行,不过最终还是选用了一个开源项目,效果看起来更棒。

代码演示:

spinner在dialog中的使用,dialog中关于view的xml布局。

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">
 
    <spinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginbottom="2dp" />
 
    <edittext
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="8dp" />
 
</linearlayout>

dialog初始化,加载,显示出来的完整代码(包含对spinner进行adapter设置)。

private void showalertdialog() {
    view view = layoutinflater.from(this).inflate(r.layout.dialog_add_notebook, null);
    spinner spinner = view.findviewbyid(r.id.spinner);
    arrayadapter<string> arrayadapter = new arrayadapter<>(this, r.layout.simple_spinner_item, android.r.id.text1, categories);
    spinner.setadapter(arrayadapter);
    spinner.setonitemselectedlistener(new adapterview.onitemselectedlistener() {
        @override
        public void onitemselected(adapterview<?> parent, view view, int position, long id) {
            toast.maketext(mainactivity.this, "选中的分类是: " + categories.get(position), toast.length_long).show();
        }
 
        @override
        public void onnothingselected(adapterview<?> parent) {
 
        }
    });
    new alertdialog.builder(this)
            .settitle("提示")
            .setview(view)
            .setpositivebutton(android.r.string.ok, new dialoginterface.onclicklistener() {
                @override
                public void onclick(dialoginterface dialog, int which) {
                    dialog.dismiss();
                }
            })
            .show();
}

只能说spinner在dialog中,显示出来的效果一般般,即使通过自定义item布局,调整padding,感觉效果也不是特别让人满意。

截张图:

 Spinner在Dialog中的使用效果

在github上找到一个不错的项目,https://github.com/lesilva/betterspinner

修改代码,替换为betterspinner。

在app/build.gradle中添加

compile ‘com.weiwangcn.betterspinner:library:1.1.0’

xml布局文件修改为:

<?xml version="1.0" encoding="utf-8"?>
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">
 
    <com.weiwangcn.betterspinner.library.material.materialbetterspinner
        android:id="@+id/spinner"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginbottom="@dimen/activity_vertical_margin"
        android:hint="@string/notebook_choose_notebook_hint" />
 
    <edittext
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="8dp" />
 
</linearlayout>

显示dialog的方法调整为

public void onclickedaddnotebook(final string parentnotebookid, list<notebook> notebooks) {
    view view = layoutinflater.from(mactivity).inflate(r.layout.dialog_add_notebook, null);
    final edittext medit = (edittext) view.findviewbyid(r.id.edit);
    final materialbetterspinner spinner = (materialbetterspinner) view.findviewbyid(r.id.spinner);
    final list<notebook> tempnotebooks = new arraylist<>();
    tempnotebooks.clear();
    tempnotebooks.addall(notebooks);
    notebook rootnotebook = new notebook();
    rootnotebook.settitle(mactivity.getstring(r.string.notebook_default_root_notebook_title));
    tempnotebooks.add(0, rootnotebook);
    spinnerarrayadapter<notebook> adapter = new spinnerarrayadapter<notebook>(view.getcontext(), tempnotebooks) {
        @override
        public string itemtostring(notebook item) {
            return item.gettitle();
        }
    };
    spinner.setadapter(adapter);
    spinner.settext(rootnotebook.gettitle());
    new alertdialog.builder(mactivity)
            .settitle(r.string.add_notebook)
            .setview(view)
            .setpositivebutton(r.string.confirm, new dialoginterface.onclicklistener() {
                @override
                public void onclick(dialoginterface dialog, int which) {
                    dialog.dismiss();
                    addnotebook(medit.gettext().tostring(), getnotebookid(tempnotebooks, spinner.gettext().tostring()));
                }
            })
            .show();
}

细微之处的api有所变化,用法大多差不多,看一下最终的预览效果,觉得还是挺materialdesign风的。

 Spinner在Dialog中的使用效果