Android の Dialog カスタム レイアウトの使用 (ポップアップ ウィンドウ)、ボタンをクリックして押し続けると色が変わり、ボタンを離すと元の色が復元されます。

1. まずエフェクト画像を見て、ボタンをクリックして押し続けると赤くなり、ボタンを離すと元の色に戻ります。
ここに画像の説明を挿入
ここではビデオのデモを示します。

ダイアログポップアップ

2. まず、values/themes.xml に新しいスタイル MyDialog を作成します。

   <!-- MyDialog的配置属性 -->
    <style name="MyDialog" parent="android:Theme.Dialog">
        <!-- 背景颜色及透明程度 -->
        <item name="android:windowBackground">@android:color/transparent</item>
        <!-- 是否半透明 -->
        <item name="android:windowIsTranslucent">false</item>
        <!-- 是否没有标题 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 是否浮现在activity之上 -->
        <item name="android:windowIsFloating">true</item>
        <!-- 是否背景模糊,这个决定背景是否灰色 -->
        <item name="android:backgroundDimEnabled">true</item>
        <!-- 设置背景模糊的透明度-->
        <item name="android:backgroundDimAmount">0.5</item>
    </style>

3. Dialog クラスを継承する新しい MyDialog を作成します。

import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.Display;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;

import com.example.myapplication001.R;

public class MyDialog extends Dialog implements View.OnClickListener{
    
    
    //在构造方法里提前加载了样式
    private Context context;//上下文
    private int layoutResID;//布局文件id
    private int[] listenedItem;//监听的控件id
    public MyDialog(Context context,int layoutResID,int[] listenedItem){
    
    
        super(context,R.style.MyDialog);//加载dialog的样式
        this.context = context;
        this.layoutResID = layoutResID;
        this.listenedItem = listenedItem;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        //提前设置Dialog的一些样式
        Window dialogWindow = getWindow();
        dialogWindow.setGravity(Gravity.CENTER);//设置dialog显示居中
        //dialogWindow.setWindowAnimations();设置动画效果
        setContentView(layoutResID);


        WindowManager windowManager = ((Activity)context).getWindowManager();
        Display display = windowManager.getDefaultDisplay();
        WindowManager.LayoutParams lp = getWindow().getAttributes();
        lp.width = display.getWidth()*4/5;// 设置dialog宽度为屏幕的4/5
        getWindow().setAttributes(lp);
        setCanceledOnTouchOutside(false);//点击外部Dialog不会消失
        //遍历控件id添加点击注册
        for(int id:listenedItem){
    
    
            findViewById(id).setOnClickListener(this);
        }
    }
    private OnCenterItemClickListener listener;
    public interface OnCenterItemClickListener {
    
    
        void OnCenterItemClick(MyDialog dialog, View view);
    }
    //很明显我们要在这里面写个接口,然后添加一个方法
    public void setOnCenterItemClickListener(OnCenterItemClickListener listener) {
    
    
        this.listener = listener;
    }


    @Override
    public void onClick(View v) {
    
    
      //  dismiss();//注意:我在这里加了这句话,表示只要按任何一个控件的id,弹窗都会消失,不管是确定还是取消。
        listener.OnCenterItemClick(this,v);
    }
}

4. メインアクティビティMainActivity2は、自身で記述したMyDialogインターフェースを実装し、clickメソッドを実装します。

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;

import com.example.myapplication001.R;


public class MainActivity2 extends AppCompatActivity implements MyDialog.OnCenterItemClickListener{
    
    

    TextView tv_1;
    //定义一个自己的dialog
    private MyDialog myDialog;
    @SuppressLint({
    
    "MissingInflatedId", "WrongViewCast"})
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        tv_1 = (TextView) findViewById(R.id.tv_1);
        tv_1.setOnClickListener(new View.OnClickListener() {
    
    
            @Override
            public void onClick(View view) {
    
    
                //显示
                myDialog.show();
            }
        });

        //实例化自定义的dialog
        myDialog = new MyDialog(this,R.layout.my_dialog,new int[]{
    
    R.id.dialog_btn,R.id.dialog_btn1,R.id.dialog_btn2});
        //绑定点击事件
        myDialog.setOnCenterItemClickListener((MyDialog.OnCenterItemClickListener) this);



    }

    @Override
    public void OnCenterItemClick(MyDialog dialog, View view) {
    
    
        switch (view.getId()){
    
    
            case R.id.dialog_btn:
                //这里让弹窗关闭
                dialog.dismiss();
                Toast.makeText(getApplicationContext(),"点击了1",Toast.LENGTH_SHORT).show();
                break;
            case R.id.dialog_btn1:
                //这里让弹窗关闭
                dialog.dismiss();
                Toast.makeText(getApplicationContext(),"点击了2",Toast.LENGTH_SHORT).show();
                break;
            case R.id.dialog_btn2:
                //这里让弹窗关闭
                dialog.dismiss();
                Toast.makeText(getApplicationContext(),"点击了3",Toast.LENGTH_SHORT).show();
                break;
            default:
                break;
        }

    }

}

5. my_dialog レイアウト ファイルのコードは次のとおりです

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

    <TextView
        android:id="@+id/tv_5"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:gravity="center"
        android:text="提示消息"
        android:textColor="@color/black"
        android:textSize="34sp" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">

        <Button
            android:id="@+id/dialog_btn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="自定义dialog按钮1" />

        <Button
            android:id="@+id/dialog_btn1"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="自定义dialog按钮2" />
    </LinearLayout>

    <Button
        android:id="@+id/dialog_btn2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="自定义dialog按钮3" />

    <Button
        android:id="@+id/dialog_btn3"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_marginLeft="3dp"
        android:layout_marginRight="3dp"
        android:background="@drawable/test"
        android:text="自定义dialog按钮4" />

    <Button
        android:id="@+id/dialog_btn4"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_marginLeft="3dp"
        android:layout_marginTop="5dp"
        android:layout_marginRight="3dp"
        android:background="@drawable/test"
        android:text="自定义dialog按钮5" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="5dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/dialog_btn5"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"

            android:text="自定义dialog按钮6" />

        <Button
            android:id="@+id/dialog_btn6"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="自定义dialog按钮7" />
    </LinearLayout>
</LinearLayout>

6. my_dialog レイアウトのボタンをクリックしたままにして色を変更し、ボタンを放すと元の色に戻ります。ドローアブルフォルダーの下に新しいテストファイルを作成します。コードの内容は次のとおりです。

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false"><!--没点击按钮的时候-->
        <shape android:shape="rectangle"><!--按钮形状-->
            <solid android:color="#a8f9f7" /><!--按钮背景填充色-->
            <stroke
                android:width="1dp"
                android:color="@color/black" /><!--按钮边框-->
        </shape>
    </item>

    <!--当点击按钮的时候变为红色-->
    <item android:drawable="@color/colorRed" android:state_pressed="true" />
    <!-- 自己添加红色的颜色<color name="colorRed">#ea2e34</color>-->

</selector>

7. activity_main2 レイアウト ファイルの内容は次のとおりです

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:id="@+id/refreshLa"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv_1"
        android:layout_width="180dp"
        android:layout_height="50dp"
        android:background="@color/purple_500"
        android:gravity="center"
        android:text="新的页面1" />

    <TextView
        android:id="@+id/tv_2"
        android:layout_width="180dp"
        android:layout_height="50dp"
        android:background="@color/design_default_color_secondary"
        android:gravity="center"
        android:text="新的页面2" />


</LinearLayout>

おすすめ

転載: blog.csdn.net/qq_36570506/article/details/130182288