A implementação da caixa de diálogo Android precisa usar o objeto de instância AlertDialog.Builder
Então usamos o seguinte método deste objeto
Aqui estão alguns métodos comumente usados
setTitle(): Definir o título setview(): Definir uma página personalizada (a página personalizada será descrita em detalhes abaixo) setPositiveButton(): Geralmente usado para determinar a função setNegativeButton(): Geralmente usado para cancelar a função setOnShowListener(): A caixa de diálogo aparece setOnCancelListener( ): a caixa de diálogo desaparece
show(): Usado para exibir a caixa de diálogo Nota: Sem esta frase sua caixa de diálogo não será exibida
Geralmente, quando personalizamos a página, não escrevemos tudo em uma página, resultando em confusão de código
Muitas vezes é necessário criar uma nova página. Aqui, não há necessidade de criar uma nova atividade, apenas uma página de layout de layout é necessária
Aqui simplesmente escreva um
código mostra como abaixo:
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
<EditText
android:id="@+id/ed_ip"
android:layout_width="269dp"
android:layout_height="83dp"
android:layout_marginTop="28dp"
android:layout_marginEnd="68dp"
android:ems="10"
android:gravity="center"
android:hint="请输入IP,例如192.168.1.1"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/ed_port"
android:layout_width="261dp"
android:layout_height="86dp"
android:layout_marginTop="120dp"
android:layout_marginEnd="72dp"
android:ems="10"
android:gravity="center"
android:hint="请输入端口,例如8080"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
Então, como adicionamos ao AlertDialog?
Defina uma página personalizada usando setview():
Exibir view=LayoutInflater.from(IntroductoryActivity.this).inflate(R.layout.ipconfig,null); ip = view .findViewById(R.id.edit_ip); port = view .findViewById(R.id.edit_port); setview(visualizar);
Nota: Isso é diferente do nosso método usual de assumir os controles, devemos adicionar os controles view.Plus
Caso contrário, um erro de ponteiro nulo será relatado
Todos os exemplos de código estão anexados abaixo (este exemplo é uma página de guia, que envolve os pontos de conhecimento de armazenamento de dados, você pode ver meus outros blogs)
MainActivity: código padrão, sem função
package com.example.myapplication;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
Arquivo de layout correspondente a MainActivity: também o código padrão
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
GuideActivity : a interface principal da página do guia
package com.example.myapplication;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import java.util.ArrayList;
import java.util.List;
public class GuideActivity extends AppCompatActivity {
private ViewPager vp;
private List<ImageView> imageViews;
private int[] imgs = {R.drawable.y0, R.drawable.y1, R.drawable.y2, R.drawable.y3};
private Button btn, btn2;
private EditText ed_ip, ed_port;
private ImageView[] dotViews;
private GuideAdapter adapter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getSupportActionBar().hide();
setContentView(R.layout.activity_guide);
vp = findViewById(R.id.guide_vp);
btn = findViewById(R.id.guide_btn);
btn2 = findViewById(R.id.guide_btn2);
//初始化图片
initImgs();
//初始化底部圆点指示器
initDots();
adapter = new GuideAdapter(imageViews);
vp.setAdapter(adapter);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit();
editor.putString("isFirst", "1");
editor.apply();
Intent intent = new Intent(GuideActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
});
btn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
View view = LayoutInflater.from(GuideActivity.this).inflate(R.layout.ipconfig, null);
ed_ip = view.findViewById(R.id.ed_ip);
ed_port = view.findViewById(R.id.ed_port);
AlertDialog.Builder builder = new AlertDialog.Builder(GuideActivity.this);
SharedPreferences sp = getSharedPreferences("demo1", MODE_PRIVATE);
ed_ip.setText(sp.getString("ip", ""));
ed_port.setText(sp.getString("port", ""));
builder.setTitle("端口设置")
.setView(view)
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
SharedPreferences.Editor editor = sp.edit();
editor.putString("ip", ed_ip.getText().toString());
editor.putString("port", ed_port.getText().toString());
editor.apply();
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Toast.makeText(GuideActivity.this, "取消端口设置", Toast.LENGTH_SHORT).show();
}
})
.show();
}
});
vp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
for (int i = 0; i < dotViews.length; i++) {
if (position == i) {
dotViews[i].setImageResource(R.drawable.guide_selector);
} else {
dotViews[i].setImageResource(R.drawable.guide_white);
}
if (position == dotViews.length - 1) {
btn.setVisibility(View.VISIBLE);
btn2.setVisibility(View.VISIBLE);
} else {
btn.setVisibility(View.GONE);
btn2.setVisibility(View.GONE);
}
}
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
/**
* 初始化底部圆点指示器
*/
private void initDots() {
LinearLayout layout = findViewById(R.id.guide_ll);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(20, 20);
params.setMargins(10, 0, 10, 0);
dotViews = new ImageView[imgs.length];
for (int i = 0; i < imageViews.size(); i++) {
ImageView imageView = new ImageView(this);
imageView.setLayoutParams(params);
imageView.setImageResource(R.drawable.guide_white);
if (i == 0) {
imageView.setImageResource(R.drawable.guide_selector);
} else {
imageView.setImageResource(R.drawable.guide_white);
}
dotViews[i] = imageView;
final int finalI = i;
dotViews[i].setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
vp.setCurrentItem(finalI);
}
});
layout.addView(imageView);
}
}
/**
* 初始化图片
*/
private void initImgs() {
ViewPager.LayoutParams params = new ViewPager.LayoutParams();
imageViews = new ArrayList<ImageView>();
for (int i = 0; i < imgs.length; i++) {
ImageView imageView = new ImageView(this);
imageView.setLayoutParams(params);
imageView.setImageResource(imgs[i]);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageViews.add(imageView);
}
}
}
activity_guide.xml: arquivo de layout de página de guia
<?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">
<androidx.viewpager.widget.ViewPager
android:id="@+id/guide_vp"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<LinearLayout
android:id="@+id/guide_ll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="100dp"
android:orientation="horizontal" />
<Button
android:id="@+id/guide_btn"
android:layout_width="100dp"
android:layout_height="40dp"
android:layout_above="@id/guide_ll"
android:layout_centerHorizontal="true"
android:layout_marginBottom="10dp"
android:background="#2990E3"
android:text="开始体验"
android:textColor="#ffffff"
android:visibility="invisible" />
<Button
android:id="@+id/guide_btn2"
android:layout_width="100dp"
android:layout_height="40dp"
android:layout_alignRight="@id/guide_vp"
android:layout_centerHorizontal="true"
android:layout_marginBottom="10dp"
android:background="#2990E3"
android:text="端口设置"
android:textColor="#ffffff"
android:visibility="invisible"/>
</RelativeLayout>
GuideAdapter: adaptador de página de guia
package com.example.myapplication;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;
import java.util.List;
public class GuideAdapter extends PagerAdapter {
private final List<ImageView> imageViews;
public GuideAdapter(List<ImageView> imageViews) {
this.imageViews= imageViews;
}
/**
* 获取当前要显示对象的数量
*/
@Override
public int getCount() {
return imageViews.size();
}
/**
* 判断是否用对象生成界面
*/
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object o) {
return view== o;
}
/**
* 从ViewGroup中移除当前对象
*/
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView(imageViews.get(position));
}
/**
* 当前要显示的对象
*/
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
container.addView(imageViews.get(position));
return imageViews.get(position);
}
}
ipconfig.xml: interface de configuração de IP
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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">
<EditText
android:id="@+id/ed_ip"
android:layout_width="269dp"
android:layout_height="83dp"
android:layout_marginTop="28dp"
android:layout_marginEnd="68dp"
android:ems="10"
android:gravity="center"
android:hint="请输入IP,例如192.168.1.1"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<EditText
android:id="@+id/ed_port"
android:layout_width="261dp"
android:layout_height="86dp"
android:layout_marginTop="120dp"
android:layout_marginEnd="72dp"
android:ems="10"
android:gravity="center"
android:hint="请输入端口,例如8080"
android:inputType="textPersonName"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
guide_white.xml: ponto branco não selecionado
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size android:height="20dp" android:width="20dp"/>
<solid android:color="#fff"/>
</shape>
guide_selector.xml : selecione o ponto azul
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<size android:height="20dp" android:width="20dp"/>
<solid android:color="#0687ED"/>
</shape>
As 4 fotos na página do guia podem ser adicionadas por você