Aprendizaje de desarrollo de Android (2)

1. Notificación del control (barra de notificaciones)

1.1 Uso de NotificationManager y atención a los detalles


La clase NotificationManager es una clase de administrador de notificaciones.Este objeto se obtiene mediante un servicio mantenido por el sistema en modo singleton, por lo que este objeto generalmente no se instancia directamente.

En una actividad, puede usar el método Activity.getSystemService(String) para obtener el objeto NotificationManager.

inserte la descripción de la imagen aquí

El objeto de notificación se crea a través del constructor Builder de la clase NotificationCompat.

inserte la descripción de la imagen aquí


¡Android8.0 agregó el concepto de canal, si no está configurado, la notificación no se puede mostrar en la máquina Android8.0!

El rol de Build.VERSION.SDK_INT:

  • Build.VERSION.SDK_INT En qué teléfono móvil está instalada la aplicación de software, el número de versión del sistema operativo del teléfono móvil, por ejemplo, el SDK_INT correspondiente de 8.1 es 27

inserte la descripción de la imagen aquí


La importancia del tercer parámetro del objeto NotificationChannel:
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

1.2 Uso de la notificación


inserte la descripción de la imagen aquí

inserte la descripción de la imagen aquí


Para lograr el efecto de la notificación:
inserte la descripción de la imagen aquí

Caso de código:

<?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"
    >

    <Button
        android:text="发出通知"
        android:onClick="sendNotification"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <Button
        android:text="取消通知"
        android:onClick="cancelNotification"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

Clase de activación de intención:

package com.example.mynotification;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

import androidx.annotation.Nullable;

public class NotificationActivity extends Activity {
    
    

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        Log.e("itholmes","onCreate: 进入NotificationActivity");
    }

}

La clase de notificación define la configuración, activación y otros efectos:

package com.example.mynotification;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.NotificationCompat;

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends AppCompatActivity {
    
    

    private NotificationManager manager;

    private Notification notification;

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

        // 通过getSystemService获取NotificationManager对象。
        manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        /**
         * 如果是android 8版本必须配置渠道:
         *   Build.VERSION.SDK_INT: 是获取软件app安装在哪个手机上,该手机的操作系统的版本号 比如8.1对应的SDK_INT是27
         *   NotificationManager.IMPORTANCE_HIGH: 该值为26是android API版本,对应Android 8.0(Oreo)版本。
         */
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
    
    
            NotificationChannel channel = new NotificationChannel("itholmes", "测试通知", NotificationManager.IMPORTANCE_HIGH);
            manager.createNotificationChannel(channel);
        }

        // 创建意图, 方便下面跳转意图。
        Intent intent = new Intent(this, NotificationActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

        // 通过NotificationCompat类的Builder构造器创建Notification
        notification = new NotificationCompat.Builder(this,"itholmes")
                // 设置标题
                .setContentTitle("官方通知")
                // 设置内容
                .setContentText("世界那么大,想去走走")
                // 设置小图标,R.drawable.logo就是drawable目录下面的logo图片。
                .setSmallIcon(R.drawable.logo)
                // 设置大图标,BitmapFactory.decodeResource将图片转换Bitmap形式。
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.logo))
                // 设置小图标的颜色 Color.parseColor方法将颜色转换为int类型。
                .setColor(Color.parseColor("#ff0000"))
                // 设置点击通知后的跳转意图
                .setContentIntent(pendingIntent)
                // 设置点击通知后自动清除通知
                .setAutoCancel(true)
                // .setWhen() 默认设置为当前时间
                .build();

    }

    public void sendNotification(View view){
    
    
        // 调用notify方法来触发通知。 注意:id就是唯一标识的效果。
        manager.notify(1,notification);
    }

    public void cancelNotification(View view){
    
    
        // 调用cancel方法来取消通知。
        manager.cancel(1);
    }

}

2. Barra de herramientas del control (barra de herramientas, personalmente se siente como una barra de navegación)


Para el proyecto recién creado, primero puede eliminar la barra de acción original:
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí


Esta vez, se utiliza la barra de herramientas de androidx.

Propiedades básicas de la barra de herramientas:
inserte la descripción de la imagen aquí

Un ejemplo es el siguiente:

<?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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical">

    <!-- 方式一:基本属性的使用 -->
    <androidx.appcompat.widget.Toolbar
        android:id="@+id/td"

        app:navigationIcon="@drawable/ic_baseline_arrow_back_ios_new_24"

        app:title="标题"
        app:titleTextColor="#ff0000"
        app:titleMarginStart="90dp"

        app:subtitle="子标题"
        app:subtitleTextColor="#00ffff"

        app:logo="@mipmap/ic_launcher"

        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="#ffff00" />

    <!-- 方式二:实现标题居中的效果如下 -->
    <androidx.appcompat.widget.Toolbar
        android:id="@+id/td2"
        app:navigationIcon="@drawable/ic_baseline_arrow_back_ios_new_24"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="#ffff00" >

        <TextView
            android:text="标题"
            android:layout_gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            />

        <!-- TextView 通过设置layout_gravity为center来达到居中的效果。 -->

    </androidx.appcompat.widget.Toolbar>

</LinearLayout>
package com.example.mytoolbar;

import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import android.os.Bundle;
import android.util.Log;
import android.view.View;


public class MainActivity extends AppCompatActivity {
    
    

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

        Toolbar toolbar = findViewById(R.id.td);
        // 获取到toolbar,添加Navigation的点击事件(目前对应,navigationIcon属性设置的图片最左侧那个。)
        // 这样之后最左侧的被点击后,就回触发!
        toolbar.setNavigationOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View view) {
    
    
                Log.e("TAG","toolbar被点击了");
            }
        });

    }
}

3. AlertDialog (cuadro de diálogo) del control


El efecto es el siguiente:
inserte la descripción de la imagen aquí

Propiedades básicas:
inserte la descripción de la imagen aquí


Un ejemplo es el siguiente:

actividad_principal.xml

<?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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical">

    <Button
        android:text="显示对话框"
        android:onClick="dialClick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

vista_dialogo.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_height="match_parent"
    android:layout_width="wrap_content"
    android:orientation="vertical"
    android:background="#ffff00"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <ImageView
        android:src="@mipmap/ic_launcher"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <TextView
        android:text="哈哈,天气很好"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

Actividad principal

package com.example.mytoolbar;

import androidx.appcompat.app.AppCompatActivity;

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

public class MainActivity extends AppCompatActivity {
    
    

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

    public void dialClick(View view){
    
    

        // 通过getLayoutInflater().inflate方法来获取layout布局信息
        View dialogView = getLayoutInflater().inflate(R.layout.dialog_view,null);

        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        // 这些set方法返回的都是builder,因此可以连贯起来。
        builder
            // 设置图标
            .setIcon(R.mipmap.ic_launcher)
            // 设置标题
            .setTitle("我是对话框")
            // 设置消息
            .setMessage("今天天气怎么样!")
            // 设置一个布局视图
            .setView(dialogView)
            // 设置确认按钮
            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
    
    
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
    
    
                    Log.e("tag","确认按钮被点击了");
                }
            })
            // 设置取消按钮
            .setNegativeButton("取消",new DialogInterface.OnClickListener() {
    
    
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
    
    
                    Log.e("tag","取消按钮被点击了");
                }
            })
            // 设置中间按钮
            .setNeutralButton("中间",new DialogInterface.OnClickListener() {
    
    
                @Override
                public void onClick(DialogInterface dialogInterface, int i) {
    
    
                    Log.e("tag","中间按钮被点击了");
                }
            });
        // 调用create方法创建一个AlertDialog对象
        AlertDialog alertDialog = builder.create();
        // 调用AlertDialog对象的show方法显示对话框
        alertDialog.show();
    }

}

inserte la descripción de la imagen aquí

4. PopupWindow del control (capa emergente)


Las propiedades básicas son las siguientes:
inserte la descripción de la imagen aquí


Un ejemplo es el siguiente:

actividad_principal.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:orientation="vertical"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <Button
        android:text="弹出PopupWindow"
        android:onClick="popupClick"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</LinearLayout>

popup_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="@mipmap/ic_launcher"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:text="上海" />

    <Button
        android:id="@+id/btn2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dp"
        android:text="关闭弹出层" />


</LinearLayout>

Actividad principal

package com.example.mypopupwindow;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.PopupWindow;

public class MainActivity extends AppCompatActivity {
    
    

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

    public void popupClick(View view){
    
    

        // 获取要设置在popupWindow里的布局
        View popupView = getLayoutInflater().inflate(R.layout.popup_view,null);

        /**
         * PopupWindow对象有参数构造器!
         *  第一个参数:设置在PopupWindow的布局。
         *  第二、三参数:一个宽,一个高,而ViewGroup.LayoutParams.WRAP_CONTENT是为了彻底包裹popupView布局视图。
         *  第四个参数:是否获取焦点。 该内容可以实现失去焦点,关闭弹出层效果。
         */
        PopupWindow popupWindow = new PopupWindow(
                popupView, ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT,true);


        // popupView中还有两个按钮
        Button btn1 = popupView.findViewById(R.id.btn1);
        btn1.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View view) {
    
    
                Log.e("TAG","onclick上海按钮触发");
            }
        });
        Button btn2 = popupView.findViewById(R.id.btn2);
        btn2.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View view) {
    
    
                // 关闭弹出层
                popupWindow.dismiss();
            }
        });


        // 设置背景
        popupWindow.setBackgroundDrawable(getResources().getDrawable(R.drawable.logo));

        // 相对某个控件的位置(正左下方), 这里就直接让其显示在当前view的下方实际就是按钮。
        // 第二、三参数就是设置偏移量的,不填写就是无偏移
        // 可以通过view.getWidth()和view.getHeight()来贴合! 也可以使用 - 负号
        // popupWindow.showAsDropDown(view,view.getWidth(),-view.getHeight());
        popupWindow.showAsDropDown(view);

    }

}

El efecto es el siguiente:
inserte la descripción de la imagen aquí

5. LinearLayout del diseño (layout)


Propiedades básicas:
inserte la descripción de la imagen aquí

El | en medio de android:gravity="center_horizontal|bottom" es una instrucción OR. Esta propiedad representa el efecto de centrar la parte inferior del diseño actual.

android:divider=“@drawable/ic_launcher_background”
android:showDividers=“middle”, establezca la línea divisoria, de hecho, la línea divisoria es para establecer la imagen, showDivider es la posición de visualización (hay uno entre cada dos elementos dentro del diseño medio)

Android: diseño_peso = "2"
inserte la descripción de la imagen aquí

<?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:gravity="center_horizontal"

    android:divider="@drawable/ic_baseline_drag_handle_24"
    android:showDividers="middle"
    android:dividerPadding="100dp"

    android:orientation="vertical">

    <LinearLayout
        android:layout_weight="2"
        android:layout_gravity="center_vertical"
        android:background="#ff0000"
        android:layout_width="100dp"
        android:layout_height="100dp">
    </LinearLayout>

    <LinearLayout
        android:layout_weight="1"
        android:background="#ffff00"
        android:layout_width="100dp"
        android:layout_height="100dp">

    </LinearLayout>

    <LinearLayout
        android:background="#00ffff"
        android:layout_width="100dp"
        android:layout_height="100dp">
    </LinearLayout>

</LinearLayout>

El efecto es el siguiente:
inserte la descripción de la imagen aquí

6. RelativeLayout del diseño (diseño relativo)


Propiedades básicas:
inserte la descripción de la imagen aquí

Los atributos también son fáciles de distinguir.Con padre, se posiciona de acuerdo con el contenedor principal.

  • El valor asignado es verdadero o booleano.
<?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="match_parent"
    >
	<!-- 父子之间的相对定位。 -->
    <RelativeLayout
        android:layout_centerInParent="true"
        android:background="#ff0000"
        android:layout_width="100dp"
        android:layout_height="100dp"/>

</RelativeLayout>

Sin el atributo principal, debe especificar la identificación del componente:
inserte la descripción de la imagen aquí


inserte la descripción de la imagen aquí

7. Diseño de FrameLayout (diseño de marco)


El efecto es el siguiente:

inserte la descripción de la imagen aquí


Propiedades básicas:
inserte la descripción de la imagen aquí

android:foreground="@drawable/ic_launcher_background"
android:foregroundGravity="right|center" , establezca una imagen de fondo y establezca la posición.

inserte la descripción de la imagen aquí

8. Diseño de TableLayout (diseño de tabla)


Propiedades básicas de TableLayout:
inserte la descripción de la imagen aquí


La propiedad android:collapseColumns utiliza:
inserte la descripción de la imagen aquí

También se puede operar en forma de android:collapseColumns="0,2":
inserte la descripción de la imagen aquí


Atributo android:stretchColumns="1": especifica las columnas que se pueden estirar (estirar para el espacio restante).
inserte la descripción de la imagen aquí


atributo android:shrinkColumns="1": establezca las columnas que se pueden reducir.

inserte la descripción de la imagen aquí


atributo layout_column:
inserte la descripción de la imagen aquí

atributo android:layout_span="2": abarca varias columnas.
inserte la descripción de la imagen aquí

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:stretchColumns="1"
    android:shrinkColumns="1"
    >

    <!-- TableRow代表一行 -->
    <TableRow>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_column="2"
            android:layout_span="2"
            android:text="第1个"
            />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="第2个"
            />
    </TableRow>

    <TableRow>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="第1个"
            />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="第2个"
            />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="第3个"
            />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="第4个"
            />

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="第5个"
            />

    </TableRow>

</TableLayout>

9. GridLayout (Diseño de cuadrícula)


Propiedades básicas de GridLayout:
inserte la descripción de la imagen aquí

De hecho, columnCount y rowCount controlan varias columnas y filas.
inserte la descripción de la imagen aquí


Propiedades de los controles secundarios en GridLayout:
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí

Un ejemplo es el siguiente:

<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    android:columnCount="4"
    android:rowCount="2"
    >
    <!-- 上面就是显示4列,2行的效果。其实columnCount和rowCount就是控制几列几行。 -->

    <Button
        android:text="第1个"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <Button
        android:text="第2个"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <Button
        android:text="第3个"

        android:layout_columnWeight="1"
        android:layout_rowWeight="1"

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <Button
        android:text="第4个"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

    <Button
        android:text="第5个"
        android:layout_row="1"
        android:layout_column="0"

        android:layout_columnSpan="3"
        android:layout_gravity="fill"

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</GridLayout>

10. ConstraintLayout de diseño (diseño de restricción)


Como se muestra a continuación, para establecer el diseño de restricciones:
inserte la descripción de la imagen aquí
inserte la descripción de la imagen aquí


Operaciones relacionadas para controles:

inserte la descripción de la imagen aquí


uso de directrices directrices:
inserte la descripción de la imagen aquí


Vista de configuración:
inserte la descripción de la imagen aquí


Uso de restricciones de inferencia:
inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/IT_Holmes/article/details/127329571
Recomendado
Clasificación