无法与Android自定义对话框交互

2024-02-19

好吧,请耐心听我说,因为我还没有那么多地使用自定义对话框(或者根本没有 Android 编程),而且我确信我犯了一个愚蠢的初学者错误。

因此,我有一个简单的掷骰子应用程序,我试图将其合并到我现有的应用程序中,但我想将其本质上作为弹出窗口。到目前为止我找到的解决方案是扩展一个对话框类并使用应用程序中的 xml 作为自定义布局。这实际上显示了预期的输出,但不允许我与其交互(即它在屏幕上显示骰子,但我无法滚动它们!)。

我调用的java类是这样的:

import java.io.IOException;
import java.util.Random;
import com.zeldar.scanner.R;
import android.app.Activity;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.MediaPlayer;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class RollDice extends Activity implements SensorEventListener {
    private final int rollAnimations = 50;
    private final int delayTime = 15;
    private Resources res;
    private final int[] diceImages = new int[] { R.drawable.d1, R.drawable.d2, R.drawable.d3, R.drawable.d4, R.drawable.d5, R.drawable.d6 };
    private Drawable dice[] = new Drawable[6];
    private final Random randomGen = new Random();
    @SuppressWarnings("unused")
    private int diceSum;
    private int roll[] = new int[] { 6, 6 };
    private ImageView die1;
    private ImageView die2;
    private LinearLayout diceContainer;
    private SensorManager sensorMgr; 
    private Handler animationHandler;
    private long lastUpdate = -1;
    private float x, y, z;
    private float last_x, last_y, last_z;
    private boolean paused = false;
    private static final int UPDATE_DELAY = 50;
    private static final int SHAKE_THRESHOLD = 400;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        paused = false;
        super.onCreate(savedInstanceState);
        setContentView(R.layout.dice);
        setTitle(getString(R.string.app_name));
        res = getResources();
        for (int i = 0; i < 6; i++) {
            dice[i] = res.getDrawable(diceImages[i]);
        }
        diceContainer = (LinearLayout) findViewById(R.id.diceContainer);
        diceContainer.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                try {
                    rollDice();
                } catch (Exception e) {};
            }
        });
        die1 = (ImageView) findViewById(R.id.die1);
        die2 = (ImageView) findViewById(R.id.die2);
        animationHandler = new Handler() {
            public void handleMessage(Message msg) {
                die1.setImageDrawable(dice[roll[0]]);
                die2.setImageDrawable(dice[roll[1]]);
            }
        };
        sensorMgr = (SensorManager) getSystemService(SENSOR_SERVICE);
        boolean accelSupported = sensorMgr.registerListener(this,
                sensorMgr.getDefaultSensor(SensorManager.SENSOR_ACCELEROMETER), SensorManager.SENSOR_DELAY_GAME);
        if (!accelSupported) sensorMgr.unregisterListener(this); //no accelerometer on the device
        rollDice();
    }

    private void rollDice() {
        if (paused) return;
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < rollAnimations; i++) {
                    doRoll();
                }
            }
        }).start();
        MediaPlayer mp = MediaPlayer.create(this, R.raw.roll);
        try {
            mp.prepare();
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        mp.start();
    }

    private void doRoll() { // only does a single roll
        roll[0] = randomGen.nextInt(6);
        roll[1] = randomGen.nextInt(6);
        diceSum = roll[0] + roll[1] + 2; // 2 is added because the values of the rolls start with 0 not 1
        synchronized (getLayoutInflater()) {
            animationHandler.sendEmptyMessage(0);
        }
        try { // delay to alloy for smooth animation
            Thread.sleep(delayTime);
        } catch (final InterruptedException e) {
            e.printStackTrace();
        }
    }

    public void onResume() {
        super.onResume();
        paused = false;
    }

    public void onPause() {
        super.onPause();
        paused = true;
    }

    @Override
    public void onSensorChanged(SensorEvent event) {
        Sensor mySensor = event.sensor;
        if (mySensor.getType() == SensorManager.SENSOR_ACCELEROMETER) {
            long curTime = System.currentTimeMillis();
            if ((curTime - lastUpdate) > UPDATE_DELAY) {
                long diffTime = (curTime - lastUpdate);
                lastUpdate = curTime;
                x = event.values[SensorManager.DATA_X];
                y = event.values[SensorManager.DATA_Y];
                z = event.values[SensorManager.DATA_Z];
                float speed = Math.abs(x + y + z - last_x - last_y - last_z) / diffTime * 10000;
                if (speed > SHAKE_THRESHOLD) { //the screen was shaked
                    rollDice();
                }
                last_x = x;
                last_y = y;
                last_z = z;
            }
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
        return; //this method isn't used
    }
}

这是布局 xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:id="@+id/diceContainer"
    android:orientation="vertical"
    android:gravity="center"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp" >

    <ImageView
        android:id="@+id/die1" 
        android:src="@drawable/d6"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_marginBottom="15dp"
        android:contentDescription="@string/content_dice" />

    <ImageView
        android:id="@+id/die2"
        android:src="@drawable/d6"
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:contentDescription="@string/content_dice" />

</LinearLayout>

最后,我用来创建对话框的调用:

private Dialog rollDice;

rollDice = new Dialog(ScanActivity.this);
rollDice.setContentView(R.layout.dice);
rollDice.setTitle("Roll Dice");
rollDice.setCancelable(true);
rollDice.show();

澄清一下:最令人困惑的部分是我没有收到错误,无论是在编译时还是运行时,它只是弹出窗口并且不会让我用它做任何事情(除了解雇)!


如果您想要对话框之类的东西,我建议使用带有对话框主题的活动。这将允许它像对话框一样“弹出”,但给你更大的灵活性和更容易操作,恕我直言。创建一个单独的活动来打开并将其添加到该活动的清单中

<activity android:theme="@android:style/Theme.Dialog">

Themes http://developer.android.com/guide/topics/ui/themes.html

可能有更好的方法来做到这一点,但我认为这可能适合您。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法与Android自定义对话框交互 的相关文章

  • 如何以编程方式设置 ConstraintLayout 的 XML 属性“layout_constrainedWidth”?

    ConstraintLayout中 如何转换xml属性 app layout constrainedWidth true false in code 如果你想设置constrainedWidth Height以编程方式 那么你必须采取Con
  • 如何在Java中实现复合模式?

    我想实现一个复合模式Java以便绘制软件开发组织图 因此 我们假设有多个项目经理和多个开发人员 每个开发人员都被分配给一位项目经理 并且每个开发人员都能够使用各种编程语言进行编码 项目经理领导开发人员并准确了解他们的工作量 我对这个设计模式
  • Spring Boot 1.4:Liquibase完成后的执行方法

    我有一个基于 Spring Boot 1 4 0 的项目 该项目使用 Liquibase liquibase 完成后是否可以执行方法 像 Bean 后处理器之类的东西 我想要做的是当应用程序在开发模式下启动时向我的数据库添加一些数据 在开发
  • 无法为对象堆保留足够的空间

    每次尝试运行该程序时 我都会重复出现以下异常 VM初始化期间发生错误 无法为对象堆保留足够的空间 无法创建Java虚拟机 我尝试增加虚拟内存 页面大小 和 RAM 大小 但无济于事 我怎样才能消除这个错误 运行 JVM XX MaxHeap
  • 调整 Java 类以提高 CPU 缓存友好性

    在设计java类时 对于实现CPU缓存友好性有哪些建议 到目前为止我学到的是应该尽可能多地使用 POD 即 int 而不是整数 这样 在分配包含对象时 数据将被连续分配 例如 class Local private int data0 pr
  • AWS Lambda 和 S3 - 上传的 pdf 文件为空/损坏

    我有一个 Spring 应用程序 在 AWS Lambda 上运行 它获取文件并将其上传到 AWS S3 Spring控制器发送一个MultipartFile到我的方法 使用 Amazon API Gateway 将其上传到 AWS S3
  • Android HTTP PUT 请求

    谁能给我一个HTTP PUT请求 Android 的示例代码 假设您想使用 HttpURLConnection 要执行 HTTP PUT 请使用以下命令 URL url new URL http www example com resour
  • 如何在 JUnit 中缩短(或隐藏)包名称?

    我在 JUnit 中有很长的包名称 这使得很难看到正在运行哪些测试 不幸的是 使用 Eclipse 的 缩写包名称 不起作用 有没有办法隐藏或者最好缩短它们 None
  • 为什么我的字体大小在 android webview 对象中看起来比在 android 浏览器中查看时大得多?

    我正在尝试制作一个小型 Android 应用程序 它除了在 webview 对象而不是浏览中显示网站之外什么也不做 到目前为止它加载了目标网页 但文本和图像大小都比查看页面时大得多在实际设备浏览器中 在浏览器中 页面看起来正确 但在我的应用
  • 优化两个三位数乘积的最大回文数?

    我正在研究一个面试问题 我被问到这个问题 我应该编写一个程序 从两个三位数的乘积中找到最大的回文数 这里是question https projecteuler net problem 4 我想出了这种从底部开始的蛮力方法 public c
  • Java编译错误:包不存在

    在我的工作区 wsPrivate 中 我有 3 个 gradle 项目 刽子手 像素视图 Reports PixelView 和 Reports 项目编译良好 然而 Hangman 使用这两个项目 并且有些在编译时找不到包 请参阅以下错误
  • 为什么 writeObject 抛出 java.io.NotSerializedException 以及如何修复它?

    我有这个异常 我不明白为什么会抛出它 或者我应该如何处理它 try os writeObject element catch IOException e e printStackTrace Where element is a Transf
  • 尝试模拟静态时出现 NoClassDefFoundError 或 NoSuchMethodError (不兼容的依赖项)

    When a class with static method is mocked an exception been thrown The version 2 0 0 of PowerMock displays NoClassDefFou
  • 尝试在后台使用 AsyncTask 解析 JSON 时强制关闭

    我是 Android 开发新手 正在研究 json 数据 我设法让解析工作 我想显示一个 ProgressDialog 我读到我需要使用 AsyncTask 但由于某种原因 一旦我将相同的工作代码放入 doInBackground 中 即使
  • DOM 中不再存在缓存元素

    就像在类似的问题中一样 我使用appium java 尝试选择元素 在移动应用程序中 我要转到页面 之后有许多元素 android widget ImageView 0 我需要选择 6 个 例如 这样的元素并执行其他步骤 Byt 只能选择一
  • 如何强制刷新 CallLog.Calls.CACHED_NAME 列?

    我的目标是从通话记录中收集所有未知的电话号码 这可以通过以下代码来实现 private static final String CALLOG PROJECTION CallLog Calls ID CallLog Calls CACHED
  • 运行外部进程的非阻塞线程

    我创建了一个 Java GUI 应用程序 它充当许多低级外部进程的包装器 该实用程序按原样运行 但迫切需要一项重大改进 我希望我的外部进程以非阻塞方式运行 这将允许我并行服务其他请求 简而言之 我希望能够在生成数据时处理来自外部进程的数据
  • Spring Boot 和安全性以及自定义 AngularJS 登录页面

    我正在为 Spring Security 实现一个自定义 AngularJS 登录页面 但遇到身份验证问题 遵循本教程 示例 以及他们的示例在本地运行良好 https github com dsyer spring security ang
  • Android 布局以 开头 [重复]

    这个问题在这里已经有答案了 我是 Android 应用程序开发的初学者 我的问题很简单 我似乎无法确定布局文件夹中的 xml 文件是否应以以下开头 当我制作一个入门项目时 它不存在 但我也在读一本书 上面说它应该在那里 正确的方法是什么 嗯
  • Visual Studio代码无法检测到模拟器设备或连接的电话

    I was running my app with vscode using Android emulator or my phone however all of a sudden vscode could not identify an

随机推荐

  • IE 9 jQuery 不设置输入值

    我的问题很简单 我有一个输入文件字段 我想将其限制为仅通过 Jquery 接受 GIF 如果格式错误 请将输入值设置为空白 问题是 在 IE9 上 val 不起作用 有任何想法吗 我的 jQuery input type file chan
  • MSI 安装程序的可执行文件

    我有一个文件夹 其中包含两个 EXE 文件和许多其他文件 如何将其转换为 MSI 安装程序或某种自解压安装程序以便安装Main exe到 Windows 中的程序 第二个EXE文件是因为两个EXE文件之间的通信 我更希望它能够包含 桌面快捷
  • 转义字符串中的双引号

    如何在 Grails 中转义字符串中的双引号 string 12 10 On Going Submission of Made Up Samples 我尝试了很多方法 text artifact text encodeAsJavaScrip
  • 将变量传递给部分,rails 3?

    我有一个这样的循环 然后在我的中间部分 如何访问当前帖子 尝试这个 像这样你就会有一个局部变量post部分内可用
  • 如何将div添加到React Native?

    我刚刚开始我的反应本机应用程序并遇到了一些麻烦 我有一些反应经验 但这似乎没有多大帮助 文本周围的 div 应该是我的应用程序标题 所以我尝试对其进行样式设置 但由于某种原因它会抛出一个错误 指出无法识别 import StatusBar
  • Mercurial - 如何从分叉的父级获取最新更改?

    我接触 Mercurial 已经有一段时间了 现在我已经在 BitBucket 上建立了几个项目 一个是另一个项目的分叉 我已经能够毫无问题地对每个存储库进行更改 但我不明白的一件事是如何使分支与父存储库的更改保持同步 在我分叉了一个存储库
  • Mockito:想要但没有被调用

    我有以下测试方法 MyClass myClass Mockito mock MyClass class Mockito when myClass methodUsedInMethodBeingTested Matchers any MyTy
  • Python pandas:将字符串拆分为多列并从拆分参数中提取列的数据

    我对 Python 和 Pandas 很陌生 在一列中有一些 URL 路径 我想将其分成单独的列 字符串的每个参数都用分号分隔 我知道关于如何通过分隔符将数据拆分为多个列还有许多其他答案 但是在我的示例中 我想动态创建列并从参数本身提取要放
  • 一次为多个结构实现一个特征[重复]

    这个问题在这里已经有答案了 我有特质FooTrait它有很多功能 我也有结构FooStruct and BarStruct并想要实施FooTrait对于两个结构体 其方法完全相同 有没有办法实现FooTrait对彼此而言FooStruct
  • 我可以将我自己的 Python 类与 numpy 或其他矩阵库一起使用吗?

    我希望能够使用 Python 类作为元素进行矩阵运算 在本例中 是一个简单的伽罗瓦域 http en wikipedia org wiki Galois field执行 它实现了必要的 add mul sub etc 起初 我认为这应该可以
  • Javascript:iFrame 中的事件

    我正在建造一个WYISWYG编辑器与iframe with designMode on 问题是我无法在 Firefox 和 Opera 中的 iframe 上使用任何事件 IE 未经测试 例如我想跟踪 onkeyup 事件 document
  • 如何在 python 中使用带有可选字符的正则表达式?

    假设我有一个字符串 3434 35353 和另一个字符串 3593 如何创建一个能够匹配两者的正则表达式 而无需在另一个失败时将模式设置为其他内容 我知道 d 将匹配3593 但它对3434 35353 but d d 只会匹配带小数的那个
  • 无法在 GCP AI Platform 笔记本上安装 Jupyterlab 扩展

    我在安装 Jupyterlab 扩展时开始遇到以前从未遇到过的问题 安装 Jupyterlab 的新扩展后 我无法构建 我正在使用 GCP AI Platform Notebooks 运行 Jupyterlab 我在 Debian 10 上
  • socket.gaierror: [Errno -2] 名称或服务未知

    我是套接字编程的新手 以下程序是一个从服务器请求文件的客户端程序 但我收到如下所示的错误 我的输入是 GET index html 代码是 谁能帮我解决这个错误 usr bin env python import httplib impor
  • R 可以将表情符号字符转换为对应的文本吗?

    在我昨天的提问中 R 可以读取 html 编码的表情符号字符吗 https stackoverflow com questions 48142634 can r read html encoded emoji characters user
  • jQuery - 使用 .val() 函数检测值变化

    我们都知道使用val 不会触发change事件 所以我们也使用 trigger change 在 后面val 但问题是有人写了val 没有与trigger 这是一个外部文件 我无法编辑它 那么 如何通过如下代码检测值变化 elem on c
  • 多房间预订的数据库设计:一对多

    主要实体 客户 客人 预订 房间分配 我想实现一个多房间预订数据库设计 首先我想先解释一下这个概念 The Client是获得预订的人 The Client一次只能有 1 个预订 The Client可以预订多个房间 The Guest是被
  • 确定最后一个文件块

    我正在尝试为大文件设置通过休息上传的文件 下面的函数负责分块 但我需要能够识别最后一个块 因为我的其余调用更改为 finishUpload 以便提交保存 现在我只能弄清楚 blob 何时为空 但我无法弄清楚如何确定 blob 为空之前的最后
  • python del 与 pandas drop

    我知道这可能是老争论了 但出于pandas drop and python del哪个函数在大数据集上的性能更好 我正在使用机器学习学习python 3并且不确定该使用哪一个 我的数据在pandas数据帧格式 但python del函数在b
  • 无法与Android自定义对话框交互

    好吧 请耐心听我说 因为我还没有那么多地使用自定义对话框 或者根本没有 Android 编程 而且我确信我犯了一个愚蠢的初学者错误 因此 我有一个简单的掷骰子应用程序 我试图将其合并到我现有的应用程序中 但我想将其本质上作为弹出窗口 到目前