Directorio de artículos
- 1. Notificación del control (barra de notificaciones)
- 2. Barra de herramientas del control (barra de herramientas, personalmente se siente como una barra de navegación)
- 3. AlertDialog (cuadro de diálogo) del control
- 4. PopupWindow del control (capa emergente)
- 5. LinearLayout del diseño (layout)
- 6. RelativeLayout del diseño (diseño relativo)
- 7. Diseño de FrameLayout (diseño de marco)
- 8. Diseño de TableLayout (diseño de tabla)
- 9. GridLayout (Diseño de cuadrícula)
- 10. ConstraintLayout de diseño (diseño de restricción)
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.
El objeto de notificación se crea a través del constructor Builder de la clase NotificationCompat.
¡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
La importancia del tercer parámetro del objeto NotificationChannel:
1.2 Uso de la notificación
Para lograr el efecto de la notificación:
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:
Esta vez, se utiliza la barra de herramientas de androidx.
Propiedades básicas de la barra de herramientas:
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:
Propiedades básicas:
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();
}
}
4. PopupWindow del control (capa emergente)
Las propiedades básicas son las siguientes:
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:
5. LinearLayout del diseño (layout)
Propiedades básicas:
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"
<?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:
6. RelativeLayout del diseño (diseño relativo)
Propiedades básicas:
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:
7. Diseño de FrameLayout (diseño de marco)
El efecto es el siguiente:
Propiedades básicas:
android:foreground="@drawable/ic_launcher_background"
android:foregroundGravity="right|center" , establezca una imagen de fondo y establezca la posición.
8. Diseño de TableLayout (diseño de tabla)
Propiedades básicas de TableLayout:
La propiedad android:collapseColumns utiliza:
También se puede operar en forma de android:collapseColumns="0,2":
Atributo android:stretchColumns="1": especifica las columnas que se pueden estirar (estirar para el espacio restante).
atributo android:shrinkColumns="1": establezca las columnas que se pueden reducir.
atributo layout_column:
atributo android:layout_span="2": abarca varias columnas.
<?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:
De hecho, columnCount y rowCount controlan varias columnas y filas.
Propiedades de los controles secundarios en GridLayout:
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:
Operaciones relacionadas para controles:
uso de directrices directrices:
Vista de configuración:
Uso de restricciones de inferencia: