首页
登录 | 注册

Spinner在Dialog中的使用效果

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

本文同步自http://javaexception.com/archives/91

背景:

记得很久以前,碰到一个需求场景,需要在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中的使用效果

 


相关文章

  • 汝之蜜糖,吾之砒霜——聊聊软件开发中的最佳实践
        "描述一个事物,唯有一个名词定义它的概念,唯有一个动词揭露它的行为,唯有一个形容词表现它的特征.要做的,就是用心去寻找那个名词.那个动词.那个形容词--" -- 福楼拜 (Gustave Flaubert)   ...
  • 1.前言 最近在写一个小项目,里面主要涉及的就是表与表之间复杂的关系.当真正开发起来的时候,才发现自己对复杂的表关系间的查询有点混乱,趁着这几天的时间,重新梳理了一下. 2.概念 在开始之前,先明确几个基础概念: 正向查询:关联字段所在的表 ...
  • 转载请标明出处:http://www.cnblogs.com/zblade/ 一.概述 整理遇到的一些较难处理的bug,总结相关经验 二.主要问题 2.1 material类型的依赖修改 对于material类型的asset,如果修改了其s ...
  • 转载请标明出处:http://www.cnblogs.com/zblade/ 一.概要 归纳总结游戏中使用到的各种纹理压缩格式,详解各自的来源和原理. 二.图片格式和纹理格式 2.1 图片格式和纹理格式 图片格式,是图片文件的存储格式,用于 ...
  • final关键字可用于修饰类.方法和变量,final修饰的类不能被继承:final修饰的方法不可被重写:final修饰的变量不可被改变. 1. final类 final修饰的类不能被继承意思是final修饰的类不可以有子类,java.lan ...
  • ERP不规范,同事两行泪
    最近的很多次对外交流,都聊到了ERP建设的话题,并且无一例外的不那么让人省心,回想我这么多年走过的ERP坑坑路,在这里也写下经验和总结,希望能给正在或者即将走上ERP建设路的企业一些思考和帮助. 导读 1.几个瞎眼而普遍的案例 2.ERP的 ...

2019 cecdns.com webmaster#cecdns.com
12 q. 0.062 s.
京ICP备10005923号