Android View And Activity

View与GroupView

Android里的图形界面都是由View和ViewGroup以及他们的子类构成的: View:所有可视化控件的父类,提供组件描绘和时间处理方法 。 ViewGroup: View类的子类,可以拥有子控件,可以看作是容器 Android UI中的控件都是按照这种层次树的结构堆叠得。 创建UI布局的方式有两种, 自己在Java里写代码或者通过XML定义布局,后者显得更加方便和容易理解! 也是我们最常用的手段!另外我们一般很少直接用View和ViewGroup来写布局,更多的 时候使用它们的子类控件或容器来构建布局!
以下是本篇文章正文内容,下面案例可供参考

布局是什么?

布局是摆放控件的规则,可以认为布局是一个透明的容器。
透明容器内部按照规则去摆放控件。
只关注android:开头的即可。
Android中有六大布局,分别是:

  1. LinearLayout(线性布局)
  2. RelativeLayout(相对布局)
  3. TableLayout(表格布局)
  4. FrameLayout(帧布局)
  5. AbsoluteLayout(绝对布局)
  6. GridLayout(网格布局)

而今天我们要讲解的就是前两个布局。
LinearLayout(线性布局),我们屏幕适配的使用 用的比较多的就是LinearLayout的weight(权重属性)。

线性布局

线性布局表示内部的控件横着或者竖着排成一排。
android:orientation=“vertical” 方向
可选值:horizontal(水平),vertical(垂直)

线性布局支持比例划分的。

//共同作用分宽度
android:layout_width="0dp"
android:layout_weight="2"

相对布局

在某个参照物的某个方向或位置,相对布局的第一步就是给参照物起一个名字(id).
相对布局中,如果不指定子控件的相对位置,默认都在左上角堆放。
例子:创建一个新的布局文件

  1. 选中res—layout文件夹,右键—New—Android XML File
  2. 在弹出的窗口中的File栏,输入要创建的布局文件的名称(全英文小写,单词间使用_分割)
  3. 在下方的Root Element栏目中选择要使用的布局后点击Finish按键完成创建
给某个布局或控件起一个id
android:id="@+id/text1"

在某个参照物的右边
android:layout_toRightOf="@id/text1"
在某个参照物的左边
ndroid:layout_toLeftOf="@id/text1"
在某个参照物的下面
android:layout_below="@id/text1"
在某个参照物的上面
android:layout_above="@id/text1"

在父控件的中间
android:layout_centerInParent="true"
在父控件的水平中心
android:layout_centerHorizontal="true"
在父控件的垂直中心
android:layout_centerVertical="true"

对齐父控件的左边
android:layout_alignParentLeft="true"
对齐父控件的右边
android:layout_alignParentRight="true"
对齐父控件的顶端
android:layout_alignParentTop="true"
对齐父控件的底部
android:layout_alignParentBottom="true"

对齐某个控件的左边/右边
android:layout_alignLeft="@id/btn1"
android:layout_alignRight="@id/btn1"
对齐某个控件的顶端/底部
android:layout_alignTop="@id/btn1"
android:layout_alignBottom="@id/btn1"

布局嵌套

布局之间可以嵌套,对于外层的布局而言,内层的布局也相当于一个控件。
理论上布局可以嵌套任意层次,但是为了性能起见,应该尽可能的少用嵌套。

常用控件

TextView 文本显示控件

设置显示文字
android:text="我今晚想吃卷饼" 

如果给TextView设置比较大的宽度和高度时,文字默认在左上。
可以通过设置重力方向来控制文字的位置。
android:gravity="center"

设置文字大小(单位使用sp)
android:textSize="10sp"

设置为浏览器的超链接
android:autoLink="web"

Button 按钮 和 ImageButton

Button是TextView的子类,拥有TextView的绝大多数属性。
另外身为一个子类,Button也对其父类TextView做出了一些改动。
例如:文字默认居中,增加了按钮的点击效果。

ImageView 图片显示控件

功能用于显示图片

设置显示的图片
android:src="@drawable/xxx"

图片命名规则:

扫描二维码关注公众号,回复: 12271239 查看本文章
  1. 不允许数字开头
  2. 不允许大写英文
  3. 不允许中文和特殊的符号
    drawable目录中有任何一个违规的都不行

GridView 网格视图

    <GridView
        android:id="@+id/grid"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:horizontalSpacing="10dp"
        android:numColumns="3"
        android:verticalSpacing="30dp" >
    </GridView>

效果如图:

监听器 Listener

类似于提前先设定好某个“约定”(某个达成的条件A→执行某段代码B·)。
如果在程序运行的过程中达成了这个条件A,则自动触发B。
如果在程序运行的过程中没有达成条件A,则永远不会触发B。

“万物皆对象”
xml中布置控件(控件必须有id) → .java中找到对象

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        //按钮绑定id
        mBtn = (Button) findViewById(R.id.btn1);
        mBtn.setOnClickListener(new OnClickListener() {
    
    
            
            @Override
            public void onClick(View v) {
    
    
                //创建一个Intent对象
                //1.导包
                //2.参数一:当前的类名.this   参数二:要跳转的类名.class
                Intent intent = new Intent(MyActivity.this,MainActivity.class);
                //跳转
                startActivity(intent);
            }
        });
    }

AndroidMainfest.xml 清单配置文件
清单配置文件需要将其他页面的Activity配置到清单文件中。

多个按钮,多个监听器情况:

//1.使用当前的MainActivity主页面类实现OnClickListener接口
public class MainActivity extends Activity implements OnClickListener {
    
    

    private Button mBtn1, mBtn2, mBtn3;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mBtn1 = (Button) findViewById(R.id.btn1);
        mBtn2 = (Button) findViewById(R.id.btn2);
        mBtn3 = (Button) findViewById(R.id.btn3);
        
        //设置点击事件监听器
        //A:点击事件  OnClick
        mBtn1.setOnClickListener(this);
        mBtn2.setOnClickListener(this);
        mBtn3.setOnClickListener(this);
    }

    /**
     * 
     * @param v 点击的按钮的对象
     */
    @Override
    public void onClick(View v) {
    
    
        switch (v.getId()) {
    
     //获得点击的控件的id
        case R.id.btn1: //B1
            Toast.makeText(MainActivity.this, "您点击了按钮1", Toast.LENGTH_SHORT).show();
            break;
        case R.id.btn2: //B2
            Toast.makeText(MainActivity.this, "您点击了按钮2", Toast.LENGTH_SHORT).show();
            break;
        case R.id.btn3: //B3
            Toast.makeText(MainActivity.this, "您点击了按钮3", Toast.LENGTH_SHORT).show();
            break;
        }
    }
}

输出Log日志

在程序的关键节点输出一些调试信息,这些信息无法被用户感知,但是可以被开发者在后台截取。

//tag:日志的标签
//msg:日志显示的内容
Log.d(String tag,String msg)

例子:点击一下按钮,在后台输出一句调试信息。

捕获日志的两种方式:
1.IDE(集成开发环境):Eclipse

  1. 确认当前的环境是否已经连接到对应的模拟器上,点击Open Perspective…(右上角)
  2. 选择新窗口中的DDMS窗口,点击Open按钮
  3. 在DDMS窗口的Devices标签中,确认设备已经连接
  4. 确认连接无误后回到编辑窗口的logcat窗口中
  5. 在Logcat窗口的左上角,点击绿色的加号
  6. 在新弹出的窗口中,前两个空输入标签名称(如MainActivity),点击OK按钮。

2.adb(安卓调试桥)------建议
需要先配置环境变量
进入到开发环境的目录下,有一个sdk文件夹,里面有一个platform-tools文件夹。
复制platform-tools的路径到环境变量中。

  1. 点击Win+R,输入cmd,回车。
    在命令行黑窗口中,输入adb,回车,进行验证。
  2. adb命令:
    验证已经连接的设备
    adb devices
  3. 筛选Log
    adb logcat -s 标签名称,例如:
    adb logcat -s MainActivity

Toast 基本使用

直接调用Toast类的makeText()方法

 @Override
            public void onClick(View v) {
    
    
                //B:弹出个小窗提示
                //参数一:固定搭配
                //参数二:要显示的文字
                //参数三:持续时长Toast.LENGTH_SHORT或者Toast.LENGTH_LONG
                Toast.makeText(MainActivity.this, "点击了", Toast.LENGTH_SHORT).show();
            }

Intent 基本使用

四大组件间的 枢纽——Intent(意图),Android通信的桥梁。

MainActivity.java :发送数据

public class MainActivity extends Activity {
    
    
    
    private TextView mText1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        mText1 = (TextView) findViewById(R.id.text1);
        
        //设置显示的内容
        mText1.setText("https://mini.eastday.com//a//201218135517111.html?qid=juheshuju&referrer=");
        //设置点击事件的监听器
        mText1.setOnClickListener(new OnClickListener() {
    
    
            
            @Override
            public void onClick(View v) {
    
    
                Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                //携带参数(参数一:数据名称;参数二:数据的值)
                intent.putExtra("data", mText1.getText());
                startActivity(intent);
            }
        });      
    }
}

Second.java 接收并显示数据

public class SecondActivity extends Activity{
    
       
    private TextView mText;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        mText = (TextView) findViewById(R.id.text_custom);
        
        //获取上个页面跳转来的数据
        String text = getIntent().getStringExtra("data"); //参数是数据的名称,见发送的时候的第一个参数
        //设置到TextView上
        mText.setText(text);
    }
}

Activity

Activity是一个应用程序的组件,他在屏幕上提供了一个区域,允许用户在上面做一些交互性的操作, 比如打电话,照相,发送邮件,或者显示一个地图!Activity可以理解成一个绘制用户界面的窗口, 而这个窗口可以填满整个屏幕,也可能比屏幕小或者浮动在其他窗口的上方!

生命周期

在这里插入图片描述回调方法:在特定的时机(系统的时机,无需手动设定)自动调用的方法。
Activity会在各个特定的时机回调一个特定方法,用户可以在这些特定的时机下调用一些代码。

-----页面开始启动-----
D/MainActivity( 2349): onCreate
D/MainActivity( 2349): onStart
D/MainActivity( 2349): onResume
------前台运行状态---------
-------开始退到后台--------
D/MainActivity( 2349): onPause
D/MainActivity( 2349): onStop
--------完全处于后台--------
--------开始返回前台--------
D/MainActivity( 2349): onStart
D/MainActivity( 2349): onResume
---------前台运行状态--------
---------关闭页面(例如点击返回键)------
D/MainActivity( 2349): onPause
D/MainActivity( 2349): onStop
D/MainActivity( 2349): onDestroy

onCreate/onDestroy
页面的启动/销毁
一个Activity实例,只会调用一次。

onStart/onStop
开始进入前台/完全处于后台

onResume/onPause
完全处于前台/开始进入后台

onPause中不可执行耗时的操作,应该放到onStop中去执行。

Activity的加载模式

standard 标准模式

每次启动都会创建一个新的实例进入栈。

singleTop 栈顶复用模式

如果下一个要启动的页面恰好是当前正在显示的页面,此时不会创建新的实例。

singleTask 栈内复用模式

1.包含栈顶复用
2. 如果下一个要启动的页面之前在栈内已经存在了,那么会重用这个实例,并且会把在这个实例
上面的其他实例弹出栈。

singleInstance 单例模式

  1. 全局只有一个实例
  2. 单独一个栈
  3. 退栈的时候会先清空当前的活动栈,然后再切换到其他的栈,直到这个App的所有栈都被清空。

Application 应用程序

任何一个App都有唯一的一个Application实例,用于管理整个App的所有流程。
Application的特性适合做app运行过程中数据的中转。
默认情况下,Application由谷歌设计,并没有提供数据中转和临时存储的功能。
需要用户手动覆盖官方的Application类,替换成自定义的Application类实现此功能。

自定义Application

  1. 在清单文件中注册自定义的Application(添加name属性)
  2. 在src的包下创建自定义Application的类文件
  3. 让自定义的类继承Application类。import android.app.Application;

MainActivity.java

public class MainActivity extends Activity {
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //演示如何在每一个Acitivity中获得MyApplication对象并存取数据
        MyApplication app = (MyApplication) getApplication();
        app.putData("data", "这是我扔进去的数据");
        
        //加入下面的代码是另外一个地方的Activity
        MyApplication app2 = (MyApplication) getApplication();
        String value = (String) app2.getValue("data");
        Toast.makeText(MainActivity.this, value, Toast.LENGTH_SHORT).show();
    }
}

MyApplication.java

public class MyApplication extends Application{
    
    
    private HashMap<String,Object> mData = new HashMap<String, Object>();
    
    //添加数据
    public void putData(String key,Object value) {
    
    
        mData.put(key, value);
    }

    //获取数据
    public Object getValue(String key) {
    
    
        return mData.get(key);
    }
}

Tip:
在Android中所有的on来头的方法,都不需要用户手动调用。
这些方法都会在特定的时机被调用。
实际上这些函数都是回调函数。

Object类是所有类的父类,Object可以使用多态来保存任何类型。

猜你喜欢

转载自blog.csdn.net/qq_43600467/article/details/112093885