【问题标题】:Popup dialog with transparent background具有透明背景的弹出对话框
【发布时间】:2021-09-23 09:22:41
【问题描述】:

如何使用 Jetpack Compose 创建弹出对话框,该对话框可以声明为 NavHost 目标路由并从任何其他应用页面调用。

期望结果的示例:

Compose 框架提供了 Dialog 组件,但是很难自定义,而且内置动画很丑。我更愿意使用可选的自定义动画构建自己的完全可自定义的弹出视图。问题 - 我无法创建带有透明侧视图的弹出窗口,它是黑色的。

有什么想法吗?

UPD:

再写一点代码来说明清楚

override fun onCreate(savedState: Bundle?) {
    NavHost(navController = controller, startDestination = "main_page") {
        composable(route = "main_page", content = { MainPage() })
        composable(route = "my_popup", content = { ThePopupDialog() })
    }
}

@Composable
fun MainPage() {
    // ... some button here to launch "my_popup" route by click
}

@Composable
fun ThePopupDialog() {
    Box {
        Text("The popup content here")
    }
}

ThePopupDialog 中的框视图没有覆盖整个屏幕,我需要边区是(半)透明的。

【问题讨论】:

  • 您已经尝试过哪些代码?最深层次的解决办法是研究Dialog的源码,自己创建DialogWrapper的类比。
  • 很遗憾,我的项目代码在保密协议下,不能在这里发布。但是我尝试使用现有的 Dialog 组件但没有成功(因为它不提供自定义句柄)。尝试使用常规的@Composable 视图,但无法使其透明。
  • 我绝对不是要你项目的代码。告诉我你未能使视图透明的代码。
  • 我知道这个项目在保密协议下,但是 stack-overflow 也有一个条款和规则,你必须理解它。所以你不能在没有任何代码的情况下编写问题,我们只是要求Dialog 代码(不是所有项目代码),你可以创建一个新项目并编写你的对话代码,然后如果它仍然不起作用你应该分享在这里
  • @a7d.24_ 有高级代码来说明所需的结果。你有什么建议吗?

标签: android kotlin android-jetpack-compose


【解决方案1】:

您可以简单地创建一个自定义对话类,如下所示:

package com.example.yourappname;

import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.Button;

public class OkDialog extends Dialog implements android.view.View.OnClickListener {

    public Activity c;
    public Dialog d;
    public Button yes;

    public OkDialog(Activity a) {
        super(a);
        this.c = a;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.ok_dialog);
        yes = (Button) findViewById(R.id.btn_yes);
        yes.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_yes:
                dismiss();
                break;
            default:
                break;
        }
        dismiss();
    }
}

并在您的活动中使用它,如下所示:

OkDialog myDialogue = new OkDialog(MainActivity.this);
myDialogue.show();

【讨论】:

  • 真的吗?你至少读过这个问题吗?
猜你喜欢
  • 2012-06-03
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
  • 2023-03-29
  • 2015-06-27
  • 2018-05-30
  • 2017-04-30
相关资源
最近更新 更多