zoukankan      html  css  js  c++  java
  • Android学习(二)

    ##常用控件

    所有的安卓控件都需要指定 layout_width 和 layout_height
    都具有visibility属性

    TextView

     <TextView
            android:id="@+id/txtOne"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text = "我是TextView"
            android:gravity = "center"
           />
    

    上面的TextView中有下述几个属性:

    android:id  给当前控件定义了一个**唯一**标识符
    android:layout_width="match_parent"  让控件的宽度大小和父布局一样
    android:layout_height="wrap_content"  让控件的高度大小能够刚好包含里面的内容。
    android:text  指定的显示的文本内容 
    android:gravity  指定文字的对齐方式,可选有top、bottom、left、right、center 等 可以用‘|’来同时指定多个值 例如:top|left
     android:textSize="40sp" 指定文字大小
    android:textColor="#00ff00"  指定文字颜色
    
    match_parent 填充父布局 由父布局决定控件大小 与 fill_parent含义相同。 
    wrap_content 含住内容 由控件内容决定控件大小
    

    Button

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="button"
        android:textAllCaps="false"
        />
    

    上面的Button中有下述几个属性:

    android:textAllCaps 若不指定则在布局文件中设置的字母始终大写。可以设置为 flase 就可以显示为小写字母
    

    EditText

    <EditText
        android:id="@+id/et_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="这里是提示信息"
        android:maxLines="2"/>
    
    
    android:hint  提示性文本
    android:maxLines 默认的行数是随着文本变化的,设置最大行数可以保证EditText的高度美观。
    

    ImageView

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:src="@drawable/pig"/>
    
    
    android:src  指定需要显示的图片
    

    也可以通过代码动态的修改图片:

    public class MainActivity extends AppCompatActivity {
        private ImageView imageView;
        private Button button;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            imageView = (ImageView) findViewById(R.id.image_view);
            button = (Button) findViewById(R.id.button);
    
            button.setOnClickListener(new View.OnClickListener() {//点击按钮显示图片
                @Override
                public void onClick(View v) {
                    imageView.setImageResource(R.drawable.pig);// 设置显示的图片
                }
            });
        }
    }
    

    ProgressBar

    <ProgressBar
        android:id="@+id/progress_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="visible"
        style="?android:attr/progressBarStyleHorizontal" 
        android:max="100"/>
    
    
    android:visibility  所有的Android控件都具有visibility属性,可以进行设定。如果不指定就都是可见的。 可选值由三种 visible、invisible、gone
        - visible表示控件是可见的。
        - invisible表示控件是不可见的,但是仍占据原来的位置和大小
        - gone表示空间不可见,也不占据任何屏幕空间
    style="?android:attr/progressBarStyleHorizontal" 这是进度条为水平进度条
    android:max="100" 设置进度条最大值为100
    

    可以通过代码来设置ProgressBar的可见性:

    button.setOnClickListener(new View.OnClickListener() {//点击按钮显示进度条
        @Override
        public void onClick(View v) {
            if(progressBar.getVisibility() == View.GONE)
            {
                progressBar.setVisibility(View.VISIBLE);//设置可见
            }else{
                progressBar.setVisibility(View.GONE);//设置不可见
            }
        }
    });
    

    静态修改进度条进度

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int progress = progressBar.getProgress(); //获取当前进度
            progress +=10;
            progressBar.setProgress(progress);
        }
    });
    

    每次点击后进度条增长

    AlertDialog

    AlertDialog可以在当前的页面弹出一个对话框,这个对话框是置顶与所有界面元素之上的,能够屏蔽调其他控件的交互能力,因此,AlertDialog一般用于提示一些非常重要的内容或者警告信息

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
            dialog.setCancelable(false); //设置不能点击返回键取消
            dialog.setTitle("这是一个提示框");
            dialog.setMessage("具体提示的一些信息");
            dialog.setPositiveButton("是", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //执行的一些逻辑
                }
            });
    
            dialog.setNegativeButton("否", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    //执行的一些逻辑
                }
            });
            dialog.show();
        }
    });
    

    ProgressDialog

    与AlertDialog有些类似。都可以在界面上弹出一个对话框。不同的是ProgressDialog会在对话框中显示一个进度条。用法与AlertDialog类似。

    4种基本布局

    LinearLayout 线性布局

    LinearLayout是一种常用的布局。 他会将所包含的控件在现行方向上依次排列。可以设置

    android:orientation="vertical" 垂直排列
        或
    android:orientation="horizontal" 水平排列, 这是默认值
    

    可以在布局内部的空间中设置 android:layout_gravity 属性来指定控件相对于布局的位置

    在LinearLayout中 允许我们使用比例的方式来指定控件的宽度大小。

    <EditText
        android:id="@+id/et_text"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:layout_height="wrap_content"
        android:hint="这里是提示信息"
        android:maxLines="2"/>
    
    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="button"
        android:textAllCaps="false"
        />
    

    这里制定了EditText的layout_weight属性,将Button的宽度设置为wrap_content EditText会沾满屏幕的剩余空间

    RelativeLayout 相对布局

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
    <Button
        android:id="@+id/button1"
        android:text="button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"/>
        <!--位于布局的左上-->
    
    <Button
        android:id="@+id/button2"
        android:text="button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" />
        <!--位于布局的右上/>-->
    <Button
        android:id="@+id/button3"
        android:text="button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"/>
        <!--位于布局的正中心-->
    <Button
        android:id="@+id/button4"
        android:text="button4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"/>
        <!--位于布局的左下-->
    <Button
        android:id="@+id/button5"
        android:text="button5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"/>
        <!--位于布局的右下-->
    
    <Button
        android:id="@+id/button6"
        android:text="button6"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/button3"
        android:layout_toLeftOf="@id/button3"/>
    <Button
        android:id="@+id/button7"
        android:text="button7"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/button3"
        android:layout_toRightOf="@id/button3"/>
    <Button
        android:id="@+id/button8"
        android:text="button8"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/button3"
        android:layout_toLeftOf="@id/button3"/>
    <Button
        android:id="@+id/button9"
        android:text="button9"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/button3"
        android:layout_toRightOf="@id/button3"/>
    </RelativeLayout>
    
    layout_above 表示让这个控件位于指定控件的上方
    layout_below 表示让这个控件位于指定控件的下方
    layout_toLeftOf 表示让这个控件位于指定控件左方
    layout_toRightOf 表示让这个控件在指定控件右方
    
    layout_alignParentTop 表示让这个控件在父布局中的上方
    layout_alignParentBottom 表示让这个控件在父布局中的下方
    layout_alignParentLeft 表示让这个控件在父布局中的左方
    layout_alignParentRight 表示让这个控件在父布局中的右方
    
    layout_alignLeft 表示让这个控件和另一个控件的左边缘对齐
    layout_alignRight 表示让这个控件和另一个控件的右边缘对齐
    layout_alignTop 表示让这个控件和另一个控件的上边缘对齐
    layout_alignBottom 表示让这个控件和另一个控件的下边缘对齐
    

    FrameLayout 帧布局

    在FrameLayout布局模式下, 所有的控件都会默认摆放在布局的左上角
    呈现出重叠的效果。
    可以使用layout_gravity属性来指定空间在布局中的对齐方式

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_height="match_parent"
        android:layout_width="match_parent">
    
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left"
        android:text="吧啦吧啦"/>
    <Button
        android:text="小按钮"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"/>
    
    </FrameLayout> 
    

    PercentFrameLayout 百分比布局

    1. 需要在app/build.gradle中的的dependencies闭包中添加如下内容:

      implementation 'com.android.support:percent:26.0.0-alpha1'

    2. 修改布局文件

      <android.support.percent.PercentFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          >
          <Button
              android:id="@+id/button1"
              android:text="button1"
              android:layout_gravity="left|top"
              app:layout_widthPercent="50%"
              app:layout_heightPercent="50%"
              />
          <Button
              android:id="@+id/button2"
              android:text="button2"
              android:layout_gravity="right|top"
              app:layout_widthPercent="50%"
              app:layout_heightPercent="50%"
              />
          <Button
              android:id="@+id/button3"
              android:text="button3"
              android:layout_gravity="left|bottom"
              app:layout_widthPercent="50%"
              app:layout_heightPercent="50%"
              />
          <Button
              android:id="@+id/button4"
              android:text="button4"
              android:layout_gravity="right|bottom"
              app:layout_widthPercent="50%"
              app:layout_heightPercent="50%"
              />
      
      
      </android.support.percent.PercentFrameLayout>
      

      由于百分比布局并不是内置在系统SDK当中的,所以需要写出完整的包的路径还必须定义一个app的命名空间
      其中 xmlns:app="http://schemas.android.com/apk/res-auto" 是app的命名空间
      app:layout_widthPercent 将各个按钮的宽度指定为布局的50%
      借助layout_gravity来分别将这个4个按钮放置在布局的各个位置。

    自定义控件

    所有的控件都是直接或者简介继承自View的,

    所有布局都是直接或简介继承自ViewGroup的。

    自定义布局

    自定义布局需要引入一个布局

    1. 新建一个布局 起名为title.xml

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
           android:layout_width="match_parent"
          android:layout_height="wrap_content">
          <Button
              android:id="@+id/title_back"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_gravity="center"
              android:layout_margin="5dp"
              android:text="返回"
               />
          <TextView
              android:layout_width="0dp"
              android:layout_height="wrap_content"
              android:layout_gravity="center"
              android:gravity="center"
              android:layout_margin="5dp"
              android:layout_weight="1"
              android:textSize="24sp"
              android:text="标题"
              />
          <Button
              android:id="@+id/title_edit"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_margin="5dp"
              android:layout_gravity="center"
              android:text="编辑"
              />
      </LinearLayout>
      
    2. 然后在需要引用的布局中加入

      <include layout="@layout/title" />
      
    3. 在MainActivity.java中把系统自带的标题栏隐藏掉

      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          ActionBar actionbar = getSupportActionBar();
          if(actionbar != null)
              actionbar.hide();
      }
      

    自定义控件

    1.新建一个TitleLayout 继承LinearLayout

    public class TitleLayout extends LinearLayout {
        public TitleLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
            LayoutInflater.from(context).inflate(R.layout.title, this);
        }
    }
    
    重写了LinearLayout中带有两个参数的构造函数,通过LayoutInflater的from()方法可以构建出一个LayoutInflater对象,然后调用inflate()方法就可以动态加载一个布局文件, inflate()方法需要传入两个参数第一个参数是需要加载的布局文件的ID 第二个参数是给加载好的布局文件添加一个父布局。
    
    1. 在布局文件中修改如下

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="horizontal"
          android:layout_width="match_parent"
          android:layout_height="match_parent">
      
          <!--完整类名-->
          <cn.zbuter.myapplication.TitleLayout
              android:layout_height="wrap_content"
              android:layout_width="match_parent" />
      
      </LinearLayout>
      

    3.添加按钮监听。

        public class TitleLayout extends LinearLayout {
            public TitleLayout(Context context, AttributeSet attrs) {
                super(context, attrs);
                LayoutInflater.from(context).inflate(R.layout.title, this);
    
                Button titleBack = (Button) findViewById(R.id.title_back);
                Button titleEdit = (Button) findViewById(R.id.title_edit);
    
                titleBack.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        ((Activity)getContext()).finish();
                    }
                });
                titleEdit.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Toast.makeText(getContext(), "你点击了编辑", Toast.LENGTH_SHORT).show();
                    }
                });
            }
        }
    

    ListView

    简单用法:

    1. 在activity的布局文件中加入ListView控件

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="horizontal"
      android:layout_width="match_parent"
      android:layout_height="match_parent">

      <ListView
          android:id="@+id/list_view"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />
      

    2. 在java文件中修改

      public class MainActivity extends AppCompatActivity {
          //需要展示的数据
          private String[] data = {"Apple", "Banana", "Orange", "Watermelon","Pear"};
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              ArrayAdapter<String> adapeter = new ArrayAdapter<String>(MainActivity.this,R.layout.support_simple_spinner_dropdown_item,data);
              ListView listView = (ListView) findViewById(R.id.list_view);
              //设置ListView的适配器
              listView.setAdapter(adapeter);
      
          }
      }
      

    定制ListView的界面

    1. 定义一个实体类,作为ListView适配器的适配类型,新建一个名为Fruit的类

      public class Fruit {
          private String name;
          private int imageId;
      
          public Fruit(String name, int imageId){
              this.name = name ;
              this.imageId = imageId;
          }
      
          public int getImageId() {
              return imageId;
          }
      
          public String getName() {
              return name;
          }
      }
      
    2. 为ListView的子项指定一个自定义的布局。 在layout目录下新建fruit_item.xml

      <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="horizontal" android:layout_width="match_parent"
          android:layout_height="match_parent">
      
          <ImageView
              android:id="@+id/fruit_image"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content" />
          <TextView
              android:id="@+id/fruit_name"
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_margin="10dp"
      
              android:layout_gravity="center_vertical"
              />
      </LinearLayout>
      
    3. 创建自定义适配器继承ArrayAdapter 并将泛型指定为Fruit

      public class FruitAdapter extends ArrayAdapter<Fruit> {
          private int resourceId;
      
          public FruitAdapter(Context context, int resource, List<Fruit> objects) {
              super(context, resource, objects);
              this.resourceId = resource;
          }
      
          //在每个子项被滚动到屏幕内的时候会被调用这个方法
          public View getView(int position, View convertView, ViewGroup parent) {
              Fruit fruit = getItem(position); //获取当前项的Fruit实例
              View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false); // 为子项加载我们传入的布局
              ImageView fruit_image = (ImageView) view.findViewById(R.id.fruit_image);
              TextView fruit_name = (TextView) view.findViewById(R.id.fruit_name);
              fruit_image.setImageResource(fruit.getImageId());
              fruit_name.setText(fruit.getName());
              return view;
          }
      }
      
    4. 修改MainActivity代码





  • 相关阅读:
    (73)C# 扩展方法
    网络
    (十九)守护进程
    (十二)函数返回局部变量
    (十八)WireShark 过滤语法
    (十七)linux网络命令 vconfig ifconfig
    (十六)getsockname()
    (十五)ioctl、ifreq、ifconf
    (十四)UDP协议的两个主要方法sendto和recvfrom详解
    (十三)Packet socket 和 sockaddr_ll
  • 原文地址:https://www.cnblogs.com/zbuter/p/10021087.html
Copyright © 2011-2022 走看看