本人安卓小白,公司最近项目需要用到不同的类型的用户注册,周末下午写完记录一下。

网上找了一堆没有适合自己的(或者说我没找到),写的比较基础,欢迎大家多多指导。

老规矩,先上效果图

网上在线合成的GIF图,哪位大神有比较好的合成图方法一定告诉我。

先说思路:

1.使用Spinner组件实现下拉列表;

2.监听Spinner的ID实现切换Fragment。

简单的activity_main.xml布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".SpinnerMainActivity"> <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="账号注册"
android:textSize="20sp" /> <Spinner
android:id="@+id/spinnr"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:entries="@array/cars"
android:theme="@style/Spinner"> </Spinner> <LinearLayout
android:id="@+id/ll_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"> </LinearLayout> </LinearLayout>

Spinner 自定义的字体大小,颜色,在layout下创建的布局:personal_spinner.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="left"
android:padding="5dip"
android:textColor="#000000"
android:textSize="20sp" />

我在这里使用的是Spinner 的静态加载,在valuse下创建arrays.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="cars">
<item>请选择您的账号注册类型</item>
<item>个人VIP用户注册</item>
<item>绿道司机用户注册</item>
</string-array>
</resources>

这里说一下默认加载数据的字体比较下,在valuse下的styles.xml加上自己需要的字体大小和颜色

<resources>

   ......
<style name="Spinner" parent="Widget.AppCompat.Light.DropDownItem.Spinner">
<item name="android:paddingStart">0dp</item>
<item name="android:paddingEnd">0dp</item>
<item name="android:textColor">@color/colorhei</item>
<item name="android:textSize">20sp</item>
</style>
</resources>

因为Spinner默认会自动加载,网上说了一些方法我试了一下,达不到我想要的效果,所以我直接写了3个Fragment,默认加载的第一个Fragment布局就写一个Textview,内容和第一个item一样,就做一个提示的效果,第二个和第三个Fragment布局才写完整的UI

上代码

这是第一个空的fragment布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.lvdaoproject.xialademo.FragmentDriver"> <TextView
android:layout_width="wrap_content"
android:layout_marginLeft="5dp"
android:layout_height="wrap_content"
android:text="请选择您的账号注册类型"
android:textSize="20sp" />
</LinearLayout>

第一个fragment 代码

package com.lvdaoproject.xialademo;

import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup; public class FragmentNull extends Fragment {
public FragmentNull() { } @Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragmeng_null, container, false);
return view;
} @Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
} }

第二个第三个fragment就是布局根据自己的需要写了而已,就不一一粘贴了。

下面粘贴MainActivity代码

package com.lvdaoproject.xialademo;

import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.Spinner; public class SpinnerMainActivity extends AppCompatActivity implements AdapterView.OnItemSelectedListener { private Spinner spinner;
private ArrayAdapter adapter;
private LinearLayout ll_fragment;
private FragmentDriver fragmentDriver;
private FragmentPersonVip fragmentPersonVip;
private FragmentNull fragmentNull; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
supportRequestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main); init();
} private void init() {
spinner = findViewById(R.id.spinnr);
ll_fragment = findViewById(R.id.ll_fragment); //设置ArrayAdapter内置的item样式-这里是自定义显示样式
adapter = ArrayAdapter.createFromResource(SpinnerMainActivity.this, R.array.cars, R.layout.personal_spinner); //这里设置的是Spinner的样式
adapter.setDropDownViewResource(android.R.layout.simple_spinner_item); //设置Adapter了
spinner.setAdapter(adapter); //监听Spinner的操作
spinner.setOnItemSelectedListener((AdapterView.OnItemSelectedListener) this);
} @Override
//选取时候的操作
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
if (id == 0) {
setFragmentNull();
}
if (id == 1) {
setmFragmentPersonVip();
}
if (id == 2) { setmFragmentDriver();
}
} @Override
//没被选取时的操作
public void onNothingSelected(AdapterView<?> parent) { } private void setFragmentNull() {
//判断fragmentMan是否为空,无则创建fragment对象
if (fragmentNull == null) {
fragmentNull = new FragmentNull();
}
//创建FragmentManager对象
FragmentManager manager = getFragmentManager();
//创建FragmentTransaction事务对象
FragmentTransaction fragmentTransaction = manager.beginTransaction();
//使用replace(将要替换位置的i的,替换的页面)方法实现页面的替换
fragmentTransaction.replace(R.id.ll_fragment, fragmentNull);
//提交事务
fragmentTransaction.commit();
} private void setmFragmentDriver() {
//判断fragmentMan是否为空,无则创建fragment对象
if (fragmentDriver == null) {
fragmentDriver = new FragmentDriver();
}
//创建FragmentManager对象
FragmentManager manager = getFragmentManager();
//创建FragmentTransaction事务对象
FragmentTransaction fragmentTransaction = manager.beginTransaction();
//使用replace(将要替换位置的i的,替换的页面)方法实现页面的替换
fragmentTransaction.replace(R.id.ll_fragment, fragmentDriver);
//提交事务
fragmentTransaction.commit();
} private void setmFragmentPersonVip() {
//判断fragmentMan是否为空,无则创建fragment对象
if (fragmentPersonVip == null) {
fragmentPersonVip = new FragmentPersonVip();
}
//创建FragmentManager对象
FragmentManager manager = getFragmentManager();
//创建FragmentTransaction事务对象
FragmentTransaction fragmentTransaction = manager.beginTransaction();
//使用replace(将要替换位置的i的,替换的页面)方法实现页面的替换
fragmentTransaction.replace(R.id.ll_fragment, fragmentPersonVip);
//提交事务
fragmentTransaction.commit();
}
}

在这里补充一下,Fragment我本来导的是v4的包,结果

 //使用replace(将要替换位置的i的,替换的页面)方法实现页面的替换
fragmentTransaction.replace(R.id.ll_fragment, fragmentPersonVip);

这一行第二个参数报错,也就是"fragmentPersonVip"这个小子

后来我把Fragment 的包换成import android.app.Fragment;就好了

好了,就写这么多,刚刚开始写博客,写得不好的请大家多多指教,谢谢!

												

Spinner之下拉多选,监听ID后显示不同Frgment页面的更多相关文章

  1. 9、JcomboBox下拉框事件监听

    9.JcomboBox下拉框事件监听 JComboBox()的事件监听类ItemListener.其范例代码如下: import java.awt.*; import java.awt.event.* ...

  2. Django进入监听端口就自动打开指定页面,无需导航栏手动添加(Django六)

    在我们进入监听端口时画面如下:而因为在urls.py中写过如下语句 我们在监听端口后加上/login就会跳转到login.html页面,如下图 那么如何一打开监听端口就可以走动跳转到login.htm ...

  3. js 监听后退事件及跳转页面

    //直接跳转 window.location.href="b.html"; //返回上一级页面 window.history.back(-1); //返回下一级页面 window. ...

  4. React-Native传值方式之 :DeviceEventEmitter添加监听控制并传值到其他页面

    在 native 开发中,我们可以使用广播实现事件的订阅和事件的触发,从而实现不在该页面但是可以调用该页面的方法. 在 React Native 中,我们也可以使用 DeviceEventEmitte ...

  5. vue 弹窗时 监听手机返回键关闭弹窗(页面不跳转)

    [注]:  popstate 事件 a.当活动历史记录条目更改时,将触发popstate事件. b.如果被激活的历史记录条目是通过对history.pushState()的调用创建的,或者受到对his ...

  6. bootstrap 之下拉多选

    效果如图: 一.HTML代码 <label class="col-sm-1 control-label text-right" for="ds_host" ...

  7. Bootstrap 学习笔记8 下拉菜单滚动监听

    代码部分: <nav class="navbar navbar-default"> <a href="#" class="navba ...

  8. element UI 下拉菜单滚动监听(vue指令)

    直接看代码吧,可以直接粘贴此代码到你的编辑器中看效果. <template> <div class="page-component"> <div cl ...

  9. angular6 监听url查询参数变化刷新页面

    快照snapshot取到的参数是组件第一次渲染时候的参数,当我们在页面中需要根据不同的url查询参数显示不同的内容时,快照就不能满足我们的需要了,这时候就要用ActivatedRoute服务的quer ...

随机推荐

  1. Mysql常用基础操作(备忘录)

    常常忘记mysql的一些命令行操作,甚至于说,比较复杂的sql格式记不住或忘记了,也可能根本不会考虑去记,因此,做一下汇总,当下次出现恍惚时不至于去百度挨个找,有时就是记不起来,但是只要给点药引子,立 ...

  2. pfSense配置基于时间的防火墙规则

    基于时间的规则允许防火墙规则在指定的日期和/或时间范围内激活.基于时间的规则与任何其他规则的功能相同,只是它们在预定时间之外的规则集中实际上不存在. 基于时间的规则逻辑处理基于时间的规则时,调度计划确 ...

  3. [转]为什么复制构造函数的参数需要加const和引用

    [转]为什么复制构造函数的参数需要加const和引用 一.引言 1.0在解答这个问题之前,我们先跑个小程序,看下调用关系. #include <iostream> using namesp ...

  4. 【死磕 Spring】----- IOC 之 获取 Document 对象

    原文出自:http://cmsblogs.com 在 XmlBeanDefinitionReader.doLoadDocument() 方法中做了两件事情,一是调用 getValidationMode ...

  5. Scala实现Try with resources自动关闭IO

    在处理数据库连接或者输入输出流等场景时,我们经常需要写一些非常繁琐又枯燥乏味的代码来关闭数据库连接或输入输出流. 例如数据库操作: def update(sql: String)(conn: Conn ...

  6. MySql开启慢查询日志并使用pt-query-digest 分析

    慢查询日志会将查询过程中超出你设置的时间的查询记录下来,以便供开发者进行分析和优化. 1. 开启慢查询 1.1 查看当前设置 mysql> show variables like "% ...

  7. Android进阶之光-第1章-Android新特性-读书笔记

    第 1 章 Android 新特性 1.1 Android 5.0 新特性 1.1.1 Android 5.0 主要新特性 1. 全新的 Material Design 新风格 Material De ...

  8. C语言中的神兽strdup

    C语言的确博大精深,在C语言的世界中遨游了那么多年,发现自己仍是菜鸟一枚,很多利器没有能够驾驭,今天介绍一个神兽,威力无比,但是却很少人能用得好. 函数原型: #include <string. ...

  9. ZZCMS v8.2 前台Insert注入+任意文件删除

    前几天看了水泡泡老哥的zzcms的审计,在论坛上一搜发现这个cms有不少洞.听说很适合小白练手,所以来瞅一瞅.不知道我发现的这个洞是不是已经被爆过了,如果雷同,纯属巧合. 一.Insert注入,直接返 ...

  10. 【朝花夕拾】Android安全之(一)权限篇

    前言        从Android6.0开始,Android系统对权限的处理产生了很大的变化.如果APP运行的设备系统版本为Android6.0或更高,并且target在23或更高,那么danger ...