Android 开发学习总结 & 简单猜拳游戏

1,330 阅读5分钟

基础概念

  • Android程序运行的一般步骤:

    1. 访问Mainfest.xml文件,确定默认Activity并调用该Activity类内的onCreat方法构建对应的Activity对象。

    2. onCreat方法内的setContentView方法调用此Activity的布局文件,生成需要的控件对象。

    3. 继续执行Activity类内的其他方法(设置监听器,动态修改布局…..)

  • View类,是所有控件的父类(文本、按钮、多选、单选、布局)

  • 在xml文件内设置一个View类的控件以后,会自动生成对应类的对象,之后在Activity文件内可以通过findViewById函数在R文件(所有在src文件夹内的对象在此文件内都会自动生成一个对应的int类型编号)内寻找到该控件类的对象并返回(返回的是一个View类对象!)。

  • 为控件绑定监听器的一般步骤:

    1. 获取代表控件的对象

    2. 定义一个类,实现监听器接口

    3. 生成监听器对象

    4. 为控件绑定监听器对象

    其中2,3可以简化为:生成一个匿名内部类,此类复写onClick方法后生成对象调动setClickListener函数为控件绑定监听器。

  • 一个xml文件内有且只能有一个根元素。根元素的父控件是Activity。

  • LinearLayout布局不会自动换行,线性布局内的元素只能操纵orientation属性之外的方向。

  • px = dip * (dpi/160),设计时尽量避免使用px

  • sp通常用来设置字体大小,他会更具用户设备的字体设置自动调整大小

布局

LinearLayout:

  • layout_weight属性:

使用前提:仅当子控件还没有占满父控件的所有空间时,才有实际意义。

作用:指定子控件对父控件的空闲空间的分配比例。

注意:完成分配以后,每个控件所占大小 = 控件本身大小 + 分配到的空间大小 如果按照1:1分配,分配以后两个控件并不是一样大。如果要让两个子控件评分父控件的所有空间,则可以将子控件的“本身大小”设置为0或者其他相同的值 。

控件

CheckBox:

  • 继承关系:

    CheckBox -> CompounButton -> Button ->TextView -> View

  • 方法:

Boolean isCheck()   

setChecked(boolean b)
  • 监听器
CompoundButton.OnCheckedChangeListener()

Public void onCheckedChanged(CompoundButton buttonView,boolean isChecked)

isChecked 传入的是发生点击变化以后的checked状态量

RadioGroup

  • 继承关系

    RadioGroup -> LinearLayout -> ViewGroup

  • 监听器

RadioGroup.OnCheckedChangeListener()

Public void onCheckedChanged(RadioGroup group,int checkedId)

注意区分RadioGroup的监听器和Button与RadioButton监听器的区别,参数的不同

RadioButton

  • 继承关系

    RadioButton -> CompounButton -> Button ->TextView -> View

  • 监听器

CompoundButton.OnCheckedChangeListener()

Public void onCheckedChanged(CompoundButton buttonView,boolean isChecked)

ImagView

  • 继承关系 ImageView -> View

  • 属性

    1. ScaleType:
    • fitCenter(fitStart/fitEnd):长宽等比例缩小、放大后居中(靠上/下边沿)显示
    • center:不进行缩放,局中截取相同大小以显示
    • centerInside:只对图片进行缩小,不进行放大,其他属性同fitcenter
    • centerCrop:等比例缩放,保证填充完ImageView的所有空间,其他属性同fitCenter
    1. src:指定本地文件地址,添加本地图片,推荐png格式。
    2. 可以在Activity文件中利用Glid:Glide.with(this).load().into(ImageView); 添加网络资源
  • 方法

.setImageResource(int id);
.setScalType(ScaleType.CENTER);

小技巧

整形数据+“”可以快速转换成相应的字符串

demo实训:剪刀石头布

源代码:github.com/Free-Geter/…

布局:

设计思路:

  • 布局

所有布局使用LinearLayout嵌套实现,View控件多使用weight属性使其充分填满控件。

其中需要注意的是如何让元素居中显示:

  1. 如果是要让某个控件的文字等属性居中显示,可以使用 android:gravity="center_horizontal" 实现。

注意:如果width设置为wrap _ content,那么gravity设置为center _ horizontal是无效的,height和center _ vertical的关系类似

例如:

<TextView
            android:id="@+id/textView2"
            android:layout_width="200dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:text="mode2" />
  1. 如果要实现一个控件的居中显示,则需要调用android:layout_gravity属性

注意:如果父类容器是带有vertical属性的LinearLayout,那么将android:layout_gravity设置成center_vertical也是无效的。horizontal类似。

例如

<?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="com.breakloop.textviewgravity.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="vertical">

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:layout_weight="1"
            android:text="mode1" />

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="center_horizontal"
            android:text="mode2" />
    </LinearLayout>

</LinearLayout>

遇到的主要问题

  • 从内部类中访问本地变量Proint1; 需要被声明为最终类型

    原因:当含有内部类的函数被调用完毕以后,函数参数等就会被内存机制回收,而参数是被分配到栈中的。而内部类的对象是在堆中分配内存的,外部方法调用结束后该内部类对象不一定就被销毁了;所以就会出现一个奇怪的现象:内部类对象在访问一个不存在的局部变量。

    这时候,可以用状态修饰符final修饰该变量,从而该变量成了常量,解决了这个问题。

    如果需要调用的参数还有初始值,那么就应该将该声明一个final修饰的相同类型的数组,数组内只有被调用的参数一个变量,变量的值为参数的初始值。

    例如:

        final int[] Point1 = {0};
        final int[] Point2 = {0};
  • 通过Glide.with(this).load().into(ImageView);调用网络图片时无法显示

    查看catlog发现应用没有网络授权,需要在Mainfest中声明:

    <uses-permission android:name="android.permission.INTERNET"/>

  • 在实体设备上调试时报错:

Installation did not succeed. The application could not be installed: INSTALL_FAILED_TEST_ONLY Installation failed due to: 'null'

解决方案: 在 gradle.properties 文件中添加android.injected.testOnly=false