【问题标题】:Display PopupWindow upon clicking a button?单击按钮时显示PopupWindow?
【发布时间】:2016-07-14 09:54:55
【问题描述】:

目前,我在Linear Layout 中有一个按钮,如下所示:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="@string/open_popup"
        android:onClick="createPopup"/>
</LinearLayout>

我还有一个 createPopup 扩展(在单击按钮时确实会执行)。

public void createPopup(View view) {

}

我尝试创建一个PopupWindow,其中包含TextView。然后我调用了showAtLocation(parent, gravity, x, y),其中parent 是根LinearLayoutgravityGravity.BOTTOMxy 都设置为 10

当我点击按钮时,我收到了一个IllegalStateException 错误,我调用了showAtLocation()。这是createPopup() 函数:

PopupWindow popUp;
LinearLayout layout;
LinearLayout main;
TextView value;
LayoutParams params;
boolean click = true;
public void createPopup(View view) {
    popUp = new PopupWindow(this);
    layout = new LinearLayout(this);
    main = (LinearLayout) findViewById(R.id.parent);
    value = new TextView(this);
    if(click) {
        popUp.showAtLocation(main, Gravity.BOTTOM, 10, 10);
        popUp.update(50, 50, 300, 80);
        click = false;
    } else {
        popUp.dismiss();
        click = true;
    }
    params = new LayoutParams(LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT);
    layout.setOrientation(LinearLayout.VERTICAL);
    value.setText(R.string.message);
    layout.addView(value, params);
    popUp.setContentView(layout);
    setContentView(main);
    TextView status = (TextView) findViewById(R.id.status);
    status.setTextSize(28);
    status.setText("Status of Popup: Don't worry, you're never going to get this.");
}

我想知道的是:

  • 这个错误是什么意思?
  • 为什么会出现?
  • 我该如何解决?
  • 如何创建一个在单击按钮时出现的简单弹出窗口?*

*我希望能够创建一个函数,它至少需要一个参数(这将是一个String),然后创建一个包含该String 的弹出窗口,以及一个按钮关闭弹出窗口。

编辑:不确定这是否与弹出问题有关,但是当我运行应用程序时,出现此错误:

07-13 19:51:48.448 133-133/? E/[EGL-ERROR]: egl_image* _egl_create_image_ANDROID_native_buffer(egl_display*, egl_context*, EGLClientBuffer, EGLint*, void*):593: CHUN try create image with crop 0,0,0,0


                                            [ 07-13 19:51:48.448   133:  133 E/         ]
                                            CHUN map external image rgb 1024 x 600

第二次编辑:我在上面添加了相关代码。

【问题讨论】:

  • 发布错误的完整堆栈跟踪。包括错误消息,这很重要。
  • 不知道能不能重现,但我可以试试。
  • 请确保在给出错误时使用五个完整的堆栈跟踪,这对于理解正在发生的事情非常有帮助。
  • 对不起,我不知道。下次我会这样做。

标签: java android android-linearlayout illegalstateexception android-popupwindow


【解决方案1】:

如果您正在研究如何实现对话框,我通常会创建一个单独的布局文件、类文件,然后从需要显示的位置调用它。对话框显示在中心的其他活动之上,据我所知,它们无法移动。

当你想显示对话框时,你可以调用:

private void openMyDialog() {
    MyDialog dialog = new MyDialog(this);
    dialog.show();
}

MyDialog.java 需要扩展Dialog 并实现android.view.View.OnClickListener。它将包含保存或控制布局上的元素所需的任何代码。 MyDialog.java:

import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.support.v7.app.AlertDialog;
import android.view.View;
import android.view.Window;
import android.widget.Button;
import android.widget.EditText;

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

    public Activity activity;

    public MyDialog() {
        super(null);
    }
    public MyDialog(Activity activity) {
        super(activity);
        this.activity = activity;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.my_dialog);
    }

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

}

my_dialog.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#1C1C1C">
<!-- Whatever your layout will consist of can go here -->

</RelativeLayout>

我希望这能回答您的问题。如果没有,请随时对这篇文章发表评论。我不知道如何修复您的错误(因为它不是完整的错误),但我知道如何实现自定义对话框(或弹出窗口)来检查您的其他活动。

【讨论】:

  • 感谢您的回复。我正在尝试您的解决方案,然后我将返回并查看它在文档中的工作原理的详细信息。您可以添加您正在使用的导入语句吗?
  • 我想我已经粘贴了所有必要的内容...我从一个大文件中复制了这个文件,该文件包含许多其他你不需要的东西的导入。如果您有任何其他问题,请告诉我!
  • 大约在第 18 行,上面写着this.activity = activity。 Android Studio 告诉我它无法解决。你的意思是this.setOwnerActivity(activity)
  • 不...我在复制/粘贴时不小心删除了一行...我在代码中更改了它。它应该在顶部声明一个public Activity activity;
猜你喜欢
  • 1970-01-01
  • 2021-04-07
  • 1970-01-01
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多