Android 从0开始学习开发记录

112 阅读4分钟

Android 开发学习记录

1.先行学习

  • Android 应用及其组件

image.png

  • Android UI布局 -- 通过各种的Layout控制所属View的显示位置

    通过ViewGroup.LayoutParams 设置相关的View参数

    image.png

  • 加载布局XML资源 -- 在Activity.onCreate()回调中实现布局文件的加载,

    通过setContentView()方法实现。

    image.png

    Q:后续建立的每一个activity中也是要建立相对应的oncreate()方法吗?还是说可以自动生成?

  • 对于项目会发现,经常需要clean一下我们的项目,然后再进行rebuild

2.理解文件分布

布局文件和activity就不赘述了

  • 创建的布局需要在Activity中去调用方法启动
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 用于给当前 Activity 加载一个布局
        setContentView(R.layout.first_layout);
    }
  • 创建的Activity要在AndroidMainfest.xml文件中注册才可以使用

这个是初创项目的时候就有的

其中activity 标签内添加<intent-filter> 标签就是为了用来标识首先启动的Activity是哪一个

<application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.ForTest"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true">
            <!-- 使用这个标识来标注首先启动的Activity -->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
  • 如果有新添加一个Activity,则直接在下面进行添加
<!-- 新Activity的声明 -->
    <activity
        android:name=".NewActivity"
        android:exported="true">
        <!-- 如果需要,可以在这里添加<intent-filter> -->
    </activity>
  • 如果你希望新的Activity可以通过一个特定的动作来启动,比如说点击一个URL例如http://example.com/newactivity)时,系统会启动你的应用,并打开NewActivity
<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="http" android:host="example.com" android:pathPrefix="/newactivity" />
</intent-filter>

3. Toast -- 提示

短小的信息提示

  • 在Activity的onCreate中进行设置
  • 通过 findViewById() 方法来获取当前布局中的定义元素
  • 调用 setOnClickListener是给这个元素注册一个监听器,用于监听是否有点击。点击触发时就会调用 onClick 方法。
  • Toast的使用方法:通过调用它的静态方法makeText 会创建一个 Toast 对象,然后调用 show 方法,展示 Toast。
  • 传入三个参数

第一个:Context参数 -- 上下文(Activity本身是Context 的子类)

第二个:要显示的内容

第三个:显示的时长 -- 只能选择Toast.LENGTH_SHORT 或者 Toast.LENGTH_LONG

Button bt = findViewById(R.id.bt);
bt.setOnClickListener(new View.OnClickListener(){
  @Override
  public void onClick(View view){
    Toast.makeText(MainActivity.this,"显示内容",Toast.LENGTH_SHORT).show();
  }
});

4. 在Activity中创建Menu

  • 创建相关文件:res → menu → 新建一个 menu resource file ,取名 main
  • 在这个main.xml中添加代码

<item> 标签就是来创建某一个菜单项的,然后通过属性 android:id 来给这个菜单项设置唯一标识,通过 title这个属性给菜单项指定名称。

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@+id/add_item" android:title="Add"/>
    <item android:id="@+id/remove_item" android:title="Remove"/>
</menu>
  • 显示菜单 -- 在Activity中重写onCreateOptionsMenu() 方法

显示三个点 -- Google自带的了

通过 getMenuInflater() 获取 MenuInflater 对象,然后调用他的 inflate 方法。第一个参数就是指定我们创建的 Menu 的资源,第二个参数,用与指定我们的菜单将会添加到那个 Menu 对象中,这里直接使用方法中的 menu 然后 return true,表示运行菜单显示出来,如果是 false 则创建的菜单无法显示(三个点也没有)。

  @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main,menu);
        return true;
    }
  • 操作菜单 -- 用到方法 onOptionsItemSelected()

onOptionsItemSelected()方法中通过 item.getItemId() 来判断我们点击了那个菜单项。

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.add_item:
                Toast.makeText(this,"add",Toast.LENGTH_SHORT).show();
                break;
            case R.id.remove_item:
                Toast.makeText(this,"remove",Toast.LENGTH_SHORT).show();
                break;
        }
        return true;
    }

// 但在android8 之后,我们的id就不再默认是final了(final变量在编译时被认为是常量表达式),而Switch case需要使用的是常量表达式
// 修改后的代码:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == R.id.add_item) {
        Toast.makeText(this, "add", Toast.LENGTH_SHORT).show();
    } else if (item.getItemId() == R.id.remove_item) {
        Toast.makeText(this, "remove", Toast.LENGTH_SHORT).show();
    }
    return true;
}
  • 同时在main_xml中也需要定义出菜单的图示

刚刚开始我们使用的是会报错,什么没有导入依赖巴拉巴拉的,估计是导入包不简单。

<androidx.appcompat.widget.Toolbar
        android:id="@+id/my_toolbar"
        android:layout_width="match_parent"  --表示Toolbar的宽度将与其父布局的宽度相同。
        android:layout_height="?attr/actionBarSize" --表示Toolbar的高度将使用系统定义的ActionBar大小。
        android:background="?attr/colorPrimary"
        app:layout_constraintTop_toTopOf="parent" />

app:layoutconstraintToptoTopOf="parent":这是使用ConstraintLayout布局时设置的属性。它表示Toolbar的顶部将与父布局的顶部对齐。

我们使用了androidx.appcompat.widget.Toolbar而不是android.widget.Toolbar。这是因为androidx.appcompat.widget.Toolbar是Material Components库的一部分,它提供了更多的功能和样式选项。

5.销毁一个Activity

Activity 给我们提供了一个方法finish() 我们只要调用一下这个方法,当前的 Activity 就会销毁。

学习这个博主的juejin.cn/user/431853…