显示Android Wear style AlertDialog

显示Android Wear style AlertDialog,android,android-layout,wear-os,Android,Android Layout,Wear Os,我正在寻找一种在Android Wear的设置应用程序中重新创建警报对话框的方法: 这是刷到解雇 但是,我得到的是: 只是一个简单的安卓对话。如何以Settings.apk样式显示AlertDialog?(我认为这一定是Android Wear应用程序的默认设置)我没有找到默认的方法来实现这一点,而且将自定义视图设置为AlertDialog看起来也不太好。尽管如此,你还是可以尝试一下,也许一个不同的主题可以奏效 我所做的是创建一个新的活动,并创建我自己的布局,如下所示: <?xml v

我正在寻找一种在Android Wear的设置应用程序中重新创建警报对话框的方法:

这是刷到解雇

但是,我得到的是:


只是一个简单的安卓对话。如何以Settings.apk样式显示AlertDialog?(我认为这一定是Android Wear应用程序的默认设置)

我没有找到默认的方法来实现这一点,而且将自定义视图设置为AlertDialog看起来也不太好。尽管如此,你还是可以尝试一下,也许一个不同的主题可以奏效

我所做的是创建一个新的
活动
,并创建我自己的布局,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<android.support.wearable.view.BoxInsetLayout  
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="10dp"
        app:layout_box="all">

        <TextView
            android:id="@+id/tv_longtext"
            android:layout_width="match_parent"
            android:layout_height="0sp"
            android:layout_weight="1"
            android:fontFamily="sans-serif-condensed"
            android:gravity="bottom"
            android:padding="5sp"
            android:text="Ambient screen reduces battery life."
            android:textSize="16sp" />

        <TextView
            android:id="@+id/tv_question"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fontFamily="sans-serif-condensed"
            android:gravity="center_horizontal|top"
            android:paddingBottom="15sp"
            android:paddingTop="5sp"
            android:text="Turn on?"
            android:textSize="18sp" />

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="5sp">

            <android.support.wearable.view.CircledImageView
                android:id="@+id/btn_cancel"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="left|bottom"
                android:src="@drawable/ic_cross"
                app:circle_color="#AFAFAF"
                app:circle_radius="25dp"
                app:circle_radius_pressed="20dp" />

            <android.support.wearable.view.CircledImageView
                android:id="@+id/btn_ok"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right|bottom"
                android:src="@drawable/ic_tick"
                app:circle_color="#0EB695"
                app:circle_radius="25dp"
                app:circle_radius_pressed="20dp" />
        </FrameLayout>
    </LinearLayout>
</android.support.wearable.view.BoxInsetLayout>


它看起来就像设置中的确认屏幕。也许它还需要一些调整,但我认为这是一条路要走

我也遇到了类似的问题,事实上,我没有找到一种默认的方法来解决这个问题。我曾尝试为WearOs使用AlertDialogs,但它们看起来不太好,因为即使您向它们传递自定义视图,AlertDialog类也会以一些意外的方式裁剪布局。 最终解决问题的方法是使用Dialog类(AlertDialog的父类)并向其传递自定义视图。Dialog类不会改变布局,您可以将对话框附加到活动的生命周期(这是dialogs的概念,创建自定义活动不符合此要求)

因此,您可以在活动中创建如下功能:

private void showDialog(){
Dialog=新建对话框(此对话框);
查看myLayout=GetLayoutFlater()。充气(R.layout.my_layout_id,null);
按钮正按钮=myLayout.findViewById(R.id.positive_按钮);
positiveButton.setOnClickListener(
v->{
/*您对“积极”按钮的操作被单击*/
}
);
按钮negativeButton=myLayout.findViewById(R.id.negative_按钮);
negativeButton.setOnClickListener(
v->{
/*您对负面按钮的操作已单击*/
}
);
setContentView(myLayout);
dialog.show();
}

我创建了一个类似的片段,具有如下自定义布局:

科特林代码:

/**
 * Created by nmbinh87@gmail.com on 4/12/21.
 */
class ConfirmationDialog private constructor() : DialogFragment(R.layout.confirmation_dialog) {
    var listener: Listener? = null
    var longMessage: String = ""
    var shortMessage = ""
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        tv_longtext.text = longMessage
        tv_question.text = shortMessage
        tv_longtext.visibility = if (longMessage.isEmpty()) View.GONE else View.VISIBLE
        tv_question.visibility = if (shortMessage.isEmpty()) View.GONE else View.VISIBLE
        btn_cancel.setSafeOnClickListener {
            dismiss()
            listener?.onCancel()
        }
        btn_ok.setSafeOnClickListener {
            dismiss()
            listener?.onConfirm()
        }
    }

    override fun onStart() {
        super.onStart()
        val params = dialog?.window?.attributes
        params?.width = WindowManager.LayoutParams.MATCH_PARENT
        params?.height = WindowManager.LayoutParams.MATCH_PARENT
        dialog?.window?.attributes = params as WindowManager.LayoutParams
        dialog?.window?.setBackgroundDrawable(ColorDrawable(Color.TRANSPARENT));
    }

    open class Listener {
        fun onCancel() {
        }

        open fun onConfirm() {
        }
    }

    companion object {
        fun show(
            fm: FragmentManager,
            longMessage: String = "",
            shortMessage: String = "",
            listener: Listener
        ) {
            val fragment = ConfirmationDialog()
            fragment.longMessage = longMessage
            fragment.shortMessage = shortMessage
            fragment.listener = listener
            fragment.show(fm, fm::class.simpleName)
        }
    }
}
布局:

<?xml version="1.0" encoding="utf-8"?>
<android.support.wearable.view.BoxInsetLayout 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:background="@color/colorPrimaryDark"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical"
        android:padding="10dp"
        app:layout_box="all">

        <TextView
            android:id="@+id/tv_longtext"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_weight="1"
            android:fontFamily="sans-serif-condensed"
            android:gravity="center"
            android:padding="5sp"
            android:textColor="@color/white"
            android:textSize="16sp"
            tools:text="Ambient screen reduces battery life." />

        <TextView
            android:id="@+id/tv_question"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:fontFamily="sans-serif-condensed"
            android:layout_weight="1"
            android:gravity="center"
            android:paddingTop="5sp"
            android:paddingBottom="15sp"
            android:textColor="@color/white"
            android:textSize="18sp"
            tools:text="Turn on?" />

        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="5sp">

            <android.support.wearable.view.CircledImageView
                android:id="@+id/btn_cancel"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="left|bottom"
                android:src="@drawable/ic_cc_clear"
                app:circle_color="#AFAFAF"
                app:circle_radius="25dp"
                app:circle_radius_pressed="20dp" />

            <android.support.wearable.view.CircledImageView
                android:id="@+id/btn_ok"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right|bottom"
                android:src="@drawable/ic_cc_checkmark"
                app:circle_color="#0EB695"
                app:circle_radius="25dp"
                app:circle_radius_pressed="20dp" />
        </FrameLayout>
    </LinearLayout>
</android.support.wearable.view.BoxInsetLayout>
   ConfirmationDialog.show(
        childFragmentManager,
        "",
        "Turn alarm off?",
        object : ConfirmationDialog.Listener() {
            override fun onConfirm() {
                super.onConfirm()
                turnAlarm(false)
            }
        })