Aprendizagem de desenvolvimento Android (2)

1. Notificação do controle (barra de notificação)

1.1 Uso do NotificationManager e atenção aos detalhes


A classe NotificationManager é uma classe gerenciadora de notificações, este objeto é obtido por um serviço mantido pelo sistema em modo singleton, portanto, este objeto geralmente não é instanciado diretamente.

Em uma Activity, você pode usar o método Activity.getSystemService(String) para obter o objeto NotificationManager.

insira a descrição da imagem aqui

O objeto Notification é criado por meio do construtor Builder da classe NotificationCompat.

insira a descrição da imagem aqui


Android8.0 adicionou o conceito de canal, se não estiver definido, a notificação não pode ser exibida na máquina Android8.0!

A função de Build.VERSION.SDK_INT:

  • Build.VERSION.SDK_INT Em qual celular o aplicativo de software está instalado, o número da versão do sistema operacional do celular, por exemplo, o SDK_INT correspondente de 8.1 é 27

insira a descrição da imagem aqui


A importância do terceiro parâmetro do objeto NotificationChannel:
insira a descrição da imagem aqui
insira a descrição da imagem aqui

1.2 Uso de notificação


insira a descrição da imagem aqui

insira a descrição da imagem aqui


Para obter o efeito de notificação:
insira a descrição da imagem aqui

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>

Classe de acionador de intent:

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");
    }

}

A classe de notificação define a configuração, acionamento e outros efeitos:

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 ferramentas do controle (barra de ferramentas, pessoalmente parece uma barra de navegação)


Para o projeto recém-criado, você pode remover primeiro a actionBar original:
insira a descrição da imagem aqui
insira a descrição da imagem aqui


Desta vez, a barra de ferramentas do androidx é usada.

Propriedades básicas da barra de ferramentas:
insira a descrição da imagem aqui

Um exemplo é o seguinte:

<?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 (caixa de diálogo) do controle


O efeito é o seguinte:
insira a descrição da imagem aqui

Propriedades básicas:
insira a descrição da imagem aqui


Um exemplo é o seguinte:

activity_main.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>

dialog_view.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>

Atividade 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();
    }

}

insira a descrição da imagem aqui

4. PopupWindow do controle (camada pop-up)


As propriedades básicas são as seguintes:
insira a descrição da imagem aqui


Um exemplo é o seguinte:

activity_main.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>

Atividade 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);

    }

}

O efeito é o seguinte:
insira a descrição da imagem aqui

5. LinearLayout do layout (layout)


Propriedades básicas:
insira a descrição da imagem aqui

O | no meio de android:gravity="center_horizontal|bottom" é uma instrução OR. Esta propriedade representa o efeito de centralizar a parte inferior do layout atual.

android:divider=“@drawable/ic_launcher_background”
android:showDividers=“middle”, defina a linha divisória, na verdade, a linha divisória é para definir a imagem, showDivider é a posição de exibição (há um entre cada dois elementos dentro do disposição do meio)

android:layout_weight=“2”
insira a descrição da imagem aqui

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

O efeito é o seguinte:
insira a descrição da imagem aqui

6. RelativeLayout do layout (layout relativo)


Propriedades básicas:
insira a descrição da imagem aqui

Os atributos também são fáceis de distinguir.Com pai, ele é posicionado de acordo com o contêiner pai.

  • O valor atribuído é true ou boolean.
<?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>

Sem o atributo pai, você precisa especificar o ID do componente:
insira a descrição da imagem aqui


insira a descrição da imagem aqui

7. Layout do FrameLayout (layout do quadro)


O efeito é o seguinte:

insira a descrição da imagem aqui


Propriedades básicas:
insira a descrição da imagem aqui

android:foreground="@drawable/ic_launcher_background"
android:foregroundGravity="right|center" , defina uma imagem de fundo e defina a posição.

insira a descrição da imagem aqui

8. Layout do TableLayout (layout da tabela)


Propriedades básicas do TableLayout:
insira a descrição da imagem aqui


A propriedade android:collapseColumns usa:
insira a descrição da imagem aqui

Também pode ser operado na forma de android:collapseColumns="0,2":
insira a descrição da imagem aqui


Atributo android:stretchColumns="1": especifica as colunas que podem ser esticadas (esticadas para o espaço restante).
insira a descrição da imagem aqui


Atributo android:shrinkColumns="1": Defina as colunas que podem ser reduzidas.

insira a descrição da imagem aqui


atributo layout_column:
insira a descrição da imagem aqui

Atributo android:layout_span="2": abrange várias colunas.
insira a descrição da imagem aqui

<?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. Layout de Grade (Layout de Grade)


Propriedades básicas do GridLayout:
insira a descrição da imagem aqui

Na verdade, columnCount e rowCount controlam várias colunas e linhas.
insira a descrição da imagem aqui


Propriedades de controles filho em GridLayout:
insira a descrição da imagem aqui
insira a descrição da imagem aqui

Um exemplo é o seguinte:

<?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. Layout de restrição de layout (layout de restrição)


Conforme mostrado abaixo, para definir o layout de restrição:
insira a descrição da imagem aqui
insira a descrição da imagem aqui


Operações relacionadas para controles:

insira a descrição da imagem aqui


uso de diretrizes de diretrizes:
insira a descrição da imagem aqui


Visualização de configuração:
insira a descrição da imagem aqui


Uso de restrições de inferência:
insira a descrição da imagem aqui

Acho que você gosta

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