【问题标题】:Showing Android Wear style AlertDialog显示 Android Wear 样式的 AlertDialog
【发布时间】:2015-01-14 14:39:03
【问题描述】:

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

滑动即可关闭。

但是,我得到的是这样的:

只是一个准系统的 Android 对话框。如何以 Settings.apk 样式显示 AlertDialog? (我认为必须是 Android Wear 应用程序的默认设置)

【问题讨论】:

    标签: android android-layout wear-os


    【解决方案1】:

    我发现没有默认的方法可以做到这一点,而且将自定义视图设置为 AlertDialog 看起来也不好。不过,您仍然可以尝试,也许可以使用不同的主题。

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

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

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

    【讨论】:

      【解决方案2】:

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

      所以你可以在你的活动中创建一个这样的函数:

      private void showDialog() {
        Dialog dialog = new Dialog(this);
        View myLayout = getLayoutInflater().inflate(R.layout.my_layout_id, null);
        Button positiveButton = myLayout.findViewById(R.id.positive_button);
        positiveButton.setOnClickListener(
          v -> {
            /* Your action on positive button clicked. */
          }
        );
      
        Button negativeButton = myLayout.findViewById(R.id.negative_button);
        negativeButton.setOnClickListener(
          v -> {
            /* Your action on negative button clicked. */
          }
        );
      
        dialog.setContentView(myLayout);
        dialog.show();
      }
      

      【讨论】:

      • 非常感谢!你让我开心:)
      【解决方案3】:

      我用这样的自定义布局创建了一个类似的片段:

      Kotlin 代码:

      /**
       * 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)
                  }
              })
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-02
        • 1970-01-01
        • 2015-12-22
        相关资源
        最近更新 更多