【android编程】第五讲-Android高级组件

Android第五讲高级组件

实践题Code链接:https://blog.csdn.net/xbean1028/article/details/104771559

零. 适配器Adapter

  1. 将各种数据以合适的形式显示在View中给用户看。

    img

  2. ArrayAdapter

    支持泛型操作,最简单的一个Adapter,只能展现一行文字~
    
    adapter = new ArrayAdapter<>(this,android.R.layout.simple_expandable_list_item_1,datas);
    
    ArrayAdapter的参数说明:
    
    第一个参数:context上下文对象
    第二个参数:每一个item的样式,可以使用系统提供,也可以自定义就是一个TextView
    第三个参数:数据源,要显示的数据
    
    系统提供的item的样式,可以试一试
    
    simple_list_item1:单独的一行文本框
    simple_list_item2:有两个文本框组成
    simple_list_item_checked每项都是由一个已选中的列表项
    simple_list_item_multiple_choice:都带有一个复选框
    simple_list_item_single_choice:都带有一个单选框
    

    ArrayAdapter有五种布局类型:

simple_expandable_list_item_1: img
simple_expandable_list_item_2: img
simple_list_item_checked: img
simple_list_item_multiple_choice: img
simple_list_item_single_choice: img

注:

simple_list_item_single_choice、simple_list_item_multiple_choice、simple_list_item_checked(不同的呈现方式)

这三种布局增加了选项,有单选和多选模式。常用方法为
setChoiceMode(),getCheckedItemPositions(),getCheckedItemIds();
/*表明有选项,若不设置,缺省为none,则点击后没有反应 
 * 选项模式有:CHOICE_MODE_SINGLE  单选--ListView中只能有一个item被选中 
 * CHOICE_MODE_MULTIPLE  多选--允许选中多个item 
 * CHOICE_MODE_NONE  缺省 
 */  
 例如:
listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
  1. SimpleAdapter(简单适配器)

    同样具有良好扩展性的一个Adapter,可以自定义多种效果!
    
    adapter = new SimpleAdapter(MainActivity.this,lists,R.layout.list_item
                    ,new String[]{"image","theme","content"}
                    ,new int[]{R.id.image1,R.id.text1,R.id.text2});
    
    simpleAdapter中五个参数的
    
    第一个参数:上下文对象
    第二个参数:数据源是含有Map的一个集合
    第三个参数:每一个item的布局文件
    第四个参数:new String[]{}数组,数组的里面的每一项要与第二个参数中的存入map集合的的key值一样,一一对应
    第五个参数:new int[]{}数组,数组里面的第三个参数中的item里面的控件id
    
  2. BaseAdapter

    BaseAdapter使用相对最广,因为局限性小,使用起来更加自由,自己写,抽象类
    使用BaseAdapter比较简单,主要是通过继承此类来实现BaseAdapter的四个方法:
    
    public int getCount(): 适配器中数据集的数据个数;
    
    public Object getItem(int position): 获取数据集中与索引对应的数据项;
    
    public long getItemId(int position): 获取指定行对应的ID;
    
    public View getView(int position,View convertView,ViewGroup parent): 获取没一行Item的显示内容。
    
  3. 参考链接:

    https://www.cnblogs.com/endv/p/9774417.html

    https://www.cnblogs.com/xianfeng-zhang/p/8134684.html

一. 列表和列表视图

  1. Spinner

    在value中arrays.xml定义一个数组

    使用步骤:

    1. 在布局中添加Spinner
    2. 设置数据源
    3. 设置显示的主题
    4. 添加点击的响应事件

    code:

    <Spinner 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/spinner2"
        android:entries="@array/spingarr"
        />
    
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="spingarr">
         <item>北京</item>  
        <item>上海</item>  
        <item>广州</item>  
        <item>深圳</item>  
        </string-array>
    </resources>
    
    mySpinner.setOnItemSelectedListener(new Spinner.OnItemSelectedListener() {//选择item的选择点击监听事件  
                        public void onItemSelected(AdapterView<?> arg0, View arg1,  
                                int arg2, long arg3) {  
                            // TODO Auto-generated method stub  
                            // 将所选mySpinner 的值带入myTextView 中   
                            myTextView.setText("您选择的是:" + arg2+"个");//文本说明  
                        }  
      
                        public void onNothingSelected(AdapterView<?> arg0) {  
                            // TODO Auto-generated method stub  
                            myTextView.setText("Nothing");  
                        }  
                    });  
    
  2. ListView列表视图

    1. ListView添加组件 xml

    code:

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    
    
    <LinearLayout android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        xmlns:android="http://schemas.android.com/apk/res/android">
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="26dp"
            android:text="我喜欢的教科书"/>
        <ListView
            android:id="@+id/list0"
            android:entries="@array/item0"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
        </ListView>
        
    </LinearLayout>
    

    array.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="item0">
            <item>第一行代码Android</item>
            <item>Android开发与实践</item>
            <item>疯狂Android讲义</item>
            <item>精通Android Studio</item>
        </string-array>
    </resources>
    

    mainActivity.java

    package com.example.bean.myapplication39v1;
    
    import android.app.Activity;
    import android.app.ListActivity;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.Toast;
    
    public class MainActivity extends AppCompatActivity {
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            String[] data = new String[]{"第一行代码Android","Android开发与实践","疯狂Android讲义","精通Android Studio"};
            ListView listView;
            ArrayAdapter<String> adapter;
            adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,data);
            //setListAdapter(adapter);
            listView = (ListView) findViewById(R.id.list0);
            listView.setAdapter(adapter);
            listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    
                    //通过下标来获取内容
                    String str = parent.getItemAtPosition(position).toString();
    
                    Toast.makeText(MainActivity.this, str, Toast.LENGTH_SHORT).show();
    
                    //position 数据的下标  id 数据的id
                    //Toast.makeText(MainActivity.this, "position="+position+"id="+id, Toast.LENGTH_SHORT).show();
                }
            });
        }
    }
    
    
    1. Activity继承ListActivity(extends)

    code:

    <ListView
        android:id="@+id/lv_expense"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
    </ListView>
    
    <ImageView
        android:id="@+id/image_expense"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingTop="10dp"
        android:paddingRight="10dp"
        android:paddingBottom="10dp"
        android:adjustViewBounds="true"
        android:maxWidth="72dp"
        android:maxHeight="72dp"/>
    <TextView
        android:id="@+id/tv_expense_category"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:padding="10dp"/>
    <TextView
        android:id="@+id/tv_expense_money"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="10.0000"/>
    
    List<Map<String, Object>> listitem = new ArrayList<Map<String, Object>>(); //存储数据的数组列表
    //写死的数据,用于测试
    int[] image_expense = new int[]{R.mipmap.detail_income, R.mipmap.detail_payout }; //存储图片
    String[] expense_category = new String[] {"发工资", "买衣服"};
    String[] expense_money = new String[] {"30000.00", "1500.00"};
    for (int i = 0; i < image_expense.length; i++)
    {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("image_expense", image_expense[i]);
        map.put("expense_category", expense_category[i]);
        map.put("expense_money", expense_money[i]);
        listitem.add(map);
    }
    
    //创建适配器
    // 第一个参数是上下文对象
    // 第二个是listitem
    // 第三个是指定每个列表项的布局文件
    // 第四个是指定Map对象中定义的两个键(这里通过字符串数组来指定)
    // 第五个是用于指定在布局文件中定义的id(也是用数组来指定)
    SimpleAdapter adapter = new SimpleAdapter(getActivity()
            , listitem
            , R.layout.fragment_one_item
            , new String[]{"expense_category", "expense_money", "image_expense"}
            , new int[]{R.id.tv_expense_category, R.id.tv_expense_money, R.id.image_expense});
            
    ListView listView = (ListView) v.findViewById(R.id.lv_expense);
    listView.setAdapter(adapter);
    
  3. 参考链接:

    https://blog.csdn.net/qq_38217237/article/details/79044448

    https://www.cnblogs.com/AnneHan/p/9726391.html

二.网格视图 GridView

  1. 当屏幕上有很多元素(文字、图片或其他元素)需要按矩阵格式进行显示时,就可以使用GridView控件来实现。
  2. GridView的一些属性:
1. android:numColumns=”auto_fit” //GridView的列数设置为自动,也可以设置成2、3、4……
2. android:columnWidth=”90dp " //每列的宽度,也就是Item的宽度
3. android:stretchMode=”columnWidth" //缩放与列宽大小同步
4. android:verticalSpacing=”10dp” //两行之间的边距
5. android:horizontalSpacing=”10dp” //两列之间的边距
6. android:cacheColorHint="#00000000" //去除拖动时默认的黑色背景
7. android:listSelector="#00000000" //去除选中时的黄色底色
8. android:scrollbars=“none” //隐藏GridView的滚动条
9. android:fadeScrollbars=“true” //设置为true就可以实现滚动条的自动隐藏和显示
10. android:fastScrollEnabled=“true” //GridView出现快速滚动的按钮(至少滚动4页才会显示)
11. android:fadingEdge=“none” //GridView衰落(褪去)边缘颜色为空,缺省值是vertical。(可以理解为上下边缘的提示色)
12. android:fadingEdgeLength=“10dip” //定义的衰落(褪去)边缘的长度
13. android:stackFromBottom=“true” //设置为true时,你做好的列表就会显示你列表的最下面
14. android:transcriptMode=“alwaysScroll” //当你动态添加数据时,列表将自动往下滚动最新的条目可以自动滚动到可视范围内
15. android:drawSelectorOnTop=“false” //点击某条记录不放,颜色会在记录的后面成为背景色,内容的文字可见(缺省为false)
  1. code:

    界面布局

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:tools="http://schemas.android.com/tools"
          android:orientation="vertical"
          android:layout_width="match_parent"
          android:layout_height="match_parent" >
      
          <GridView 
              android:id="@+id/gridView"
              android:layout_width="match_parent"
              android:layout_height="wrap_content"
              android:numColumns="4"
              android:horizontalSpacing="10dp"
              android:verticalSpacing="10dp">
          </GridView>
      
      </LinearLayout>
    
    

    在GridView控件中,我们通过android:numColumns="4"指定了网格的列数为4;通过android:horizontalSpacing="10dp"和android:verticalSpacing="10dp"指定了网格之间的水平距离和垂直距离都为10dp。

    网格元素布局

    <?xml version="1.0" encoding="utf-8"?>
      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"    >
          
          <ImageView
              android:id="@+id/itemImage"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_centerHorizontal="true"    >
          </ImageView>
          
          <TextView
              android:id="@+id/itemName"
              android:layout_below="@+id/itemImage"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_centerHorizontal="true"    >
          </TextView>
          
      </RelativeLayout>
    
    

    资源储存

    在该实例中,我们需要对众多的应用软件图标以及应用软件名称进行储存。很显然,应用软件图标以及应用软件名称之间存在着一一对应的关系,我们可以使用HashMap分别对应用软件图标以及应用软件名称进行存储,然后再将HashMap添加到ArrayList中,便可以完成资源的储存了。具体实现方法如下

    //将图标图片和图标名称存入ArrayList中
      //Author:博客园-依旧淡然
      ArrayList<HashMap<String, Object>> item = new ArrayList<HashMap<String, Object>>();
      for (int i = 0; i < resIds.length; i++) {
          HashMap<String, Object> map = new HashMap<String, Object>();
          map.put("itemImage", resIds[i]);
          map.put("itemName", name[i]);
          item.add(map);
      }
    
    

    其中,数组resIds[]储存着应用软件图标的资源id;数组name[]储存着应用软件名称,并通过for循环遍历语句将其存入了HashMap中。

    简单适配器SimpleAdapter

    简单适配器SimpleAdapter继承自BaseAdapter,用于将静态数据映射到xml文件中定义好的视图当中。比如可以指定静态数据为由Map组成的ArrayList。在ArrayList中每个条目对应List中的一行,Map可以包含多项数据。

    SimpleAdapter的构造方法如下:

    public SimpleAdapter (Context context, List<? extends Map

三.图像切换器 ImageSwitcher

  1. ImageSwitcher是Android中控制图片展示效果的一个控件,如:幻灯片效果

  2. 重要方法

    setImageURI([Uri](file:///F:/Android/api/docs_r01-linux/reference/android/net/Uri.html) uri):设置图片地址

    setImageResource(int))(int resid):设置图片资源库

    setImageDrawable(Drawable drawable):绘制图片

  3. 1.获取到xml布局中的ImageSwitcer控件
    2.给isImages设置工厂方法.setFactory((ViewSwitcher.ViewFactory)this);这个方法就是要给ImageSwitcher这个控件中加入ImageView这样的内容,方便切换。这里需要重写一个方法View makeView(){return imageView}
    3.得到传入该Activity的参数(点击这个图片时要传入该图片的position)
    4.数据源需要用到,在这里初始化了。
    5.给ImageSwitcher设置数据源isImage.setImageResource(images[currentPosition]);
    6.写一下两个button的点击触发方法。一个displayPrevious(View view) 一个displayNext(View view)方法。改变图片的方式就是增加/减少currentPosition,然后设置ImageResource

  4. code:

    <ImageSwitcher
            android:id="@+id/imageSwitcher1"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:layout_above="@+id/linear"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true">
        </ImageSwitcher>
    
    
    public class DisplayActivity extends Activity implements ViewSwitcher.ViewFactory {
    //注意这里该Activity需要实现ViewFactory这个接口中的一些方法,就是下面我们要用到的makeView这个方法
    
    //声明一个图片切换器
    private ImageSwitcher isImages;
    //记录当前显示的第几张图片,是一个数组的索引
    private int currentPosition;
    int[] images;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_display);
    //初始化切换器
    isImages = (ImageSwitcher) findViewById(R.id.imageSwitcher1);
    //给切换器加一个factory 可以把它看成是一个容器
    isImages.setFactory((ViewSwitcher.ViewFactory) this);
    //当前显示的图片的索引就是从intent传过来的附加信息,我们通过getIntExtra得到他
    currentPosition = getIntent().getIntExtra("position",0);
    
    images = new int[]{
    R.mipmap.image1,R.mipmap.image2,R.mipmap.image3,
    R.mipmap.image4,R.mipmap.image5,R.mipmap.image6,
    R.mipmap.image7,R.mipmap.image8,R.mipmap.image9,
    R.mipmap.image1,R.mipmap.image2,R.mipmap.image3,
    R.mipmap.image4,R.mipmap.image5,R.mipmap.image6,
    R.mipmap.image7,R.mipmap.image8,R.mipmap.image9
    };
    //给图片切换器设置图片
    isImages.setImageResource(images[currentPosition]);
    }
    /**
    * 显示上一张图片
    * 给图片索引做一个--的动作,判断当当前值小于0时,给它提示当前为第一张。
    */
    public void displayPrevious(View view){
    currentPosition--;
    if(currentPosition<0){
    Toast.makeText(this,"已经是第一张图片了",Toast.LENGTH_SHORT).show();
    currentPosition = 0;
    }
    isImages.setImageResource(images[currentPosition]);
    }
    
    /**
    * 显示下一张图片
    * 给图片索引做一个++操作,判断当 当前值大于最后一张时,提示它为最后一张
    */
    public void displayNext(View view){
    currentPosition++;
    if(currentPosition>images.length-1){
    Toast.makeText(this,"已经是最后一张图片了",Toast.LENGTH_SHORT).show();
    currentPosition = images.length-1;
    }
    isImages.setImageResource(images[currentPosition]);
    }
    
    /**完成ViewFactory接口的时候,必须要重写的方法makeView
    * 他的作用是返回来一个ImageView对象,同来显示选中的图片。
    * 我们需要给他设置一些属性,例如,设置布局等等。
    */
    @Override
    public View makeView() {
    ImageView imageView = new ImageView(this);
    imageView.setLayoutParams(new ImageSwitcher.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
    return imageView;
    }
    }
    
    原文链接:https://blog.csdn.net/a243845305/article/details/50254961
    
    

四.画廊视图 Gallery

Gallery与之前讲的Spinner有共同的父类:AbsSpinner,表明Gallery和Spinner都是一个列表框。他们之间的区别在于Spinner显示的是一个垂直的列表框,而Gallery显示的是一个水平的列表框。Gallery与Spinner有一个区别:Spinner的作用是供用户选择,而Gallery则允许用户通过拖动来查看上一个、下一个列表项。

Gallery常用的XML属性及相关方法

XML属性 相关方法 说明
android:animationDuration setAnimationDuration(int) 设置列表项切换时的动画持续时间
android:gravity setGravity(int) 设置对齐方式
android:spacing setSpacing(int) 设置Gallery内列表项之间的间距
android:unselectedAlpha setUnselectedAlpha(int) 设置没有选中列表项的透明性

Gallery本身的用法非常简单----基本上和Spinner的用法相似,只要为他提供一个内容Adapter即可,该Adapter的getView方法返回的View作为Gallery列表的列表项;如果程序需要监控到Gallery选择项的改变,可以通过为Gallery添加OnItemSelectedListener监听器即可实现。

Layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
<!-- 定义一个ImageSwitcher组件 -->
<ImageSwitcher android:id="@+id/switcher"
    android:layout_width="320dp"
    android:layout_height="320dp"
    />
<!-- 定义一个Gallery组件 -->
<Gallery android:id="@+id/gallery"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="25dp" 
    android:unselectedAlpha="0.6"
    android:spacing="3pt"
    />    
</LinearLayout>

上面的布局很简单,只定义了两个组件:ImageSwitcher和Gallery组件。主程序也很简单,为ImageSwitcher传入一个ViewFactory对象,为Gallery传入一个Adapter对象。这样ImageSwitcher和Gallery就可以工作了。

为了让ImageSwitcher可以显示Gallery中选中的图片,为Gallery绑定一个叫做OnItemSelectedListener监听。

主程序:GalleryTest.java

import android.app.Activity;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageSwitcher;
import android.widget.ImageView;
import android.widget.ViewSwitcher.ViewFactory;

public class GallaryTest extends Activity{
    int[] imageIds = new int[]
    {
        R.drawable.shuangzi, R.drawable.shuangyu,
        R.drawable.chunv, R.drawable.tiancheng, R.drawable.tianxie,
        R.drawable.sheshou, R.drawable.juxie, R.drawable.shuiping,
        R.drawable.shizi, R.drawable.baiyang, R.drawable.jinniu,
        R.drawable.mojie };

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        final Gallery gallery = (Gallery) findViewById(R.id.gallery);
        // 获取显示图片的ImageSwitcher对象
        final ImageSwitcher switcher = (ImageSwitcher) 
            findViewById(R.id.switcher);
        // 为ImageSwitcher对象设置ViewFactory对象
        switcher.setFactory(new ViewFactory()
        {
            @Override
            public View makeView()
            {
                ImageView imageView = new ImageView(GallaryTest.this);
                imageView.setBackgroundColor(0xff0000);
                imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
                imageView.setLayoutParams(new ImageSwitcher.LayoutParams(
                    LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
                return imageView;
            }
        });
        // 设置图片更换的动画效果
        switcher.setInAnimation(AnimationUtils.loadAnimation(this,
            android.R.anim.fade_in));
        switcher.setOutAnimation(AnimationUtils.loadAnimation(this,
            android.R.anim.fade_out));
        // 创建一个BaseAdapter对象,该对象负责提供Gallery所显示的图片
        BaseAdapter adapter = new BaseAdapter()
        {
            @Override
            public int getCount()
            {
                return imageIds.length;
            }
            @Override
            public Object getItem(int position)
            {
                return position;
            }
            @Override
            public long getItemId(int position)
            {
                return position;
            }

            // 该方法的返回的View就是代表了每个列表项
            @Override
            public View getView(int position, View convertView, ViewGroup parent)
            {
                // 创建一个ImageView
                ImageView imageView = new ImageView(GallaryTest.this);
                imageView.setImageResource(imageIds[position % imageIds.length]);
                // 设置ImageView的缩放类型
                imageView.setScaleType(ImageView.ScaleType.FIT_XY);
                imageView.setLayoutParams(new Gallery.LayoutParams(75, 100));
                TypedArray typedArray = obtainStyledAttributes(R.styleable.Gallery);
                imageView.setBackgroundResource(typedArray.getResourceId(R.styleable.Gallery_android_galleryItemBackground, 0));
                return imageView;
            }
        };
        gallery.setAdapter(adapter);
        gallery.setOnItemSelectedListener(new OnItemSelectedListener()
        {
            // 当Gallery选中项发生改变时触发该方法
            @Override
            public void onItemSelected(AdapterView<?> parent, View view,
                int position, long id)
            {
                switcher.setImageResource(imageIds[position % imageIds.length]);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent)
            {
            }
        });
    }
}

参考链接:https://www.cnblogs.com/Yang-jing/p/3922119.html

五.选项卡 TabHost

  1. 介绍

    TabHost可以方便地在窗口上放置多个标签页,每个标签页相当于获得了一个与外部容器大小相同的组件摆放区域
    TabHost是一个简单的容器,提供如下两种方法来创建选项卡
    newTabSpec(String tag):创建选项卡
    addTab(TabHost.TabSpec tabSpec):添加选项卡
    使用TabHost有三种方法

  2. 方法1,继承TabActivity
    主布局文件不需要定义TabHost组件,这里用三个垂直的LinearLayout作为标签页,每个标签页里面有两个TextView组件

  3. 方法2,在布局文件中使用TabHost,不用继承TabActivity
    使用findViewById获取TabHost组件
    1 在界面布局中定义TabHost组件,并为该组件定义选项卡内容
    2 使用findViewById获取TabHost组件
    3 通过TabHost对象的方法来创建和添加选项卡

  4. 方法3基本和方法2类似,不用继承TabActivity,只是Tab的内容分开到单独的xml文件,每个标签页都需要inflate一次,和方法2最大的区别就是标签页分开到不同的xml文件中

六.滚动视图 ScrollView

  1. xml创建

滚动视图有两种,一种是ScrollView,另一种是HorizontalScrollView.

<HorizontalScrollView                            <!--水平方向滚动视图-->
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
            android:textSize="50sp"
            android:text="@string/content"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
 
    </HorizontalScrollView>

请注意:ScrollView里只能有一个子控件,如果有多个就会报错!!

如果想要用两个TextView的话可以用线性布局管理器LinearLayout(或者其它的)将括起来,这样就不会报错了

  1. Java中new关键字创建

    MainActivity.java文件

   package com.example.c_huimin.myapplication;

   import android.support.v7.app.AppCompatActivity;
   import android.os.Bundle;
   import android.widget.ImageView;
   import android.widget.LinearLayout;
   import android.widget.ScrollView;
   import android.widget.TextView;

   public class MainActivity extends AppCompatActivity {

       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);
        
           LinearLayout ll = super.findViewById(R.id.ll);
           LinearLayout ll2 = new LinearLayout(MainActivity.this);
           ll2.setOrientation(LinearLayout.VERTICAL);
           
           ScrollView scrollView = new ScrollView(MainActivity.this);
           ll.addView(scrollView);
           scrollView.addView(ll2);
           
           ImageView imageView = new ImageView(MainActivity.this);
           imageView.setImageResource(R.drawable.img03);
           ll2.addView(imageView);
           
           TextView textView = new TextView(MainActivity.this);
           textView.setText(R.string.dictionary);
           ll2.addView(textView);
       }
   }

   //这段代码好比一个线性布局管理器里嵌套一个线性布局管理器,子线性布局管理器里又有2个控件,一个是ImageView, 另一个是TextView 

string.xml文件

   <resources>
       <string name="app_name">My Application</string>
       <string name="dictionary">123\n我爱你\n123\n我爱你\n123\n我爱你\n123\n我爱你\n123\n我爱你\n123\n我爱你\n123\n我爱你\n123\n我爱你\n123\n我爱你\n123\n我爱你\n123\n我爱你\n123\n我爱你\n123\n我爱你\n123\n我爱你\n123\n我爱你\n123\n我爱你\n</string>
   </resources>

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"
       tools:context=".MainActivity"
       android:id="@+id/ll"
       android:orientation="vertical"
       android:padding="16dp">
   </LinearLayout>

  1. 参考链接:https://blog.csdn.net/Huimin_520/article/details/80377179

七.自动完成文本框 AutoCompleteTextView

自动完成文本框(AutoCompleteTextView)从EditText派生而出,实际上他也是一个文本编辑框,但它比普通编辑框多了一个功能:当用户输入一定字符后,自动完成文本框会显示一个下拉菜单,供用户选择,当用户选择某个菜单后,AutoCompleteTextView按用户选择自动填写该文本框

AutoCompleteTextView除了可使用EditText提供的XML属性和方法之外,还有以下的属性

android:completionHint setCompletionHint(CharSequence) 设置下拉菜单中的提示标题
android:completionHintView 设置下拉菜单中提示标题的视图
android:completionThreshold setThreshold(int) 设置用户至少输入几个字符才会显示提示
adnroid:dropDownAnchor setDropDownAnchor(int) 设置下拉菜单的定位“锚点”组件,如果没有指定该属性,将使用该TextView本身作为定位”锚点“组件
adnroid:dropDownHeight setDropDownHeight(int) 设置下拉菜单的高度
android:dropDownHorizontalOffest 设置下拉菜单与文本框之间的水平偏移,下拉菜单默认与文本框左对齐
adnroid:dropDownVerticalOffest 设置下拉菜单与文本框之间的垂直偏移,下拉菜单默认紧跟文本框
android:dropDownWidth setDropDownWidth(int) 设置下拉菜单的宽度
android:popupBackground setDropDownBackgroundResource(int) 设置下拉菜单的背景

使用AutoCompleteTextView很简单,只要为它设置一个Adapter,该Adapter封装了AutoCompleteTextView的预测文本

<?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" >
   <!--  定义一个自动完成文本框,指定输入一个字符后进行提示 -->
   <AutoCompleteTextView 
       android:id="@+id/auto"
       android:layout_width="fill_parent"
       android:layout_height="40dip"
       android:background="#CDCDB4"
       android:completionHint="请选择您喜欢的书"   
       android:dropDownHorizontalOffset="20dp"
       android:completionThreshold="1"/>           
    
</LinearLayout>

package com.example.autocompletetextview;
 
import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.os.Build;
 
public class MainActivity extends Activity {
	//定义字符串数组,作为提示的文本
	String[] books = new String[] {
			"my name is xie",
			"my name is qing",
			"my name is cheng",
			"my name is ding",
			"my name is na"
	};
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first);
        //创建一个ArrayAdapter,封装数组
        ArrayAdapter<String> aa = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, books);
        AutoCompleteTextView view = (AutoCompleteTextView)findViewById(R.id.auto);
        //设置Adapter
        view.setAdapter(aa);
        
    }
}

参考链接:https://blog.csdn.net/qq_27384607/article/details/47151195

八. 题目记录

  1. 列表选择框的功能是 B
  • A.按下按钮后出现一个列表
  • B.提供一系列选择项供用户选择1.00/1.00
  • C.可以选择若干个列表
  • D.可以有选择性地把列表框起来
  1. 获取列表选择框的值可以使用 A

    • A.getSelectItem()方法
    • B.getText()方法
    • C.findViewById()方法
    • D.OnItemSelected()方法 0000
  2. 关于列表选择框下列说法错误的是 D

    • A.通常只能选择一个选择项
    • B.可以使用适配器保存列表选择项
    • C.可以使用String资源保存列表选择0.00/1.00
    • D.可以直接将列表项赋值给选择框
  3. 列表选择框和列表视图的区别是 B

    • A.列表视图占屏幕空间较小

    • B.列表选择框是下拉形式的,而列表视图是平铺的1.00/1.00

    • C.列表选择框不能使用适配器

    • D.列表选择框比列表视频直观

  4. 关于适配器下列哪些说法是正确的 D

    • A.适配器用于手机与外设之间的兼容问题
    • B.ArrayAdapter可以提供多种信息
    • C.SimpleAdapter只能提供文字信息
    • D.适配器主要是将数据绑定在UI控件上
  5. 图像切换器特有的功能是 B

    • A.可以设置适配器
    • B.可以使用动画效果1.00/1.00
    • C.可以使用src加载图片
    • D.可以显示图像
  6. 画廊视图 C

  • A.某一时刻只能看到一幅图片
  • B.标记为ImageSwitcher
  • C.按水平方向排列显示内容1.00/1.00
  • D.不能使用适配器
  1. 关于选项卡下列不正确的说法是 C
    • A.需要为每一个标签页创建一个布局文件
    • B.TabHost是选项卡的标记
    • C.选项卡会增加窗体的数量1.00/1.00
    • D.选项卡的好处是将页面分成多个标签页
  2. 滚动视图 C
    • A.一般在.XML文件中创建滚动视图
    • B.滚动视图可以放置多个组件
    • C.使用滚动视图可以浏览比窗口大的页面1.00/1.00
    • D.滚动视图实现了翻页功能
  3. 自动完成文本框 B
    • A.使用EditText标记
    • B.在输入了一些文字后提供一相关的可选项
    • C.可以使用entris设置可选项
    • D.可以自动填充文本框
  4. 列表选择框的标签是 D
    • A.ArrayAdaptor
    • B.ListView
    • C.List
    • D.Spinner
发布了83 篇原创文章 · 获赞 37 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/xbean1028/article/details/104758369