Android-Show自定义对话框

时间:2012-06-20 01:48:56

标签: java android eclipse dialog

在我的Android应用程序中,我正在使用自定义对话框。当我尝试显示对话框时,会导致错误。我不知道我做错了什么,我真的很困惑。

这是我的代码:

protected Dialog onCreateDialog(int id) {
    Dialog dialog;
    switch(id) {
    case 0:
        dialog = new Dialog(getApplicationContext());

        dialog.setContentView(R.layout.paused);
        dialog.setTitle("Game Paused");
        dialog.show();
        break;
    default:
        dialog = null;
    }
    return null;
}

以下是我展示对话框的方式

showDialog(0);

顺便说一句,它表示不推荐使用showDialog(int)。

Android logcat:

> 06-19 18:44:22.399: W/dalvikvm(467): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
06-19 18:44:22.419: E/AndroidRuntime(467): FATAL EXCEPTION: main
06-19 18:44:22.419: E/AndroidRuntime(467): java.lang.IllegalStateException: Could not execute method of the activity
06-19 18:44:22.419: E/AndroidRuntime(467):  at android.view.View$1.onClick(View.java:2072)
06-19 18:44:22.419: E/AndroidRuntime(467):  at android.view.View.performClick(View.java:2408)
06-19 18:44:22.419: E/AndroidRuntime(467):  at android.view.View$PerformClick.run(View.java:8816)
06-19 18:44:22.419: E/AndroidRuntime(467):  at android.os.Handler.handleCallback(Handler.java:587)
06-19 18:44:22.419: E/AndroidRuntime(467):  at android.os.Handler.dispatchMessage(Handler.java:92)
06-19 18:44:22.419: E/AndroidRuntime(467):  at android.os.Looper.loop(Looper.java:123)
06-19 18:44:22.419: E/AndroidRuntime(467):  at android.app.ActivityThread.main(ActivityThread.java:4627)
06-19 18:44:22.419: E/AndroidRuntime(467):  at java.lang.reflect.Method.invokeNative(Native Method)
06-19 18:44:22.419: E/AndroidRuntime(467):  at java.lang.reflect.Method.invoke(Method.java:521)
06-19 18:44:22.419: E/AndroidRuntime(467):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-19 18:44:22.419: E/AndroidRuntime(467):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-19 18:44:22.419: E/AndroidRuntime(467):  at dalvik.system.NativeStart.main(Native Method)
06-19 18:44:22.419: E/AndroidRuntime(467): Caused by: java.lang.reflect.InvocationTargetException
06-19 18:44:22.419: E/AndroidRuntime(467):  at com.jlennon.gametest.PlayGameActivity.pause(PlayGameActivity.java:105)
06-19 18:44:22.419: E/AndroidRuntime(467):  at java.lang.reflect.Method.invokeNative(Native Method)
06-19 18:44:22.419: E/AndroidRuntime(467):  at java.lang.reflect.Method.invoke(Method.java:521)
06-19 18:44:22.419: E/AndroidRuntime(467):  at android.view.View$1.onClick(View.java:2067)
06-19 18:44:22.419: E/AndroidRuntime(467):  ... 11 more
06-19 18:44:22.419: E/AndroidRuntime(467): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
06-19 18:44:22.419: E/AndroidRuntime(467):  at android.view.ViewRoot.setView(ViewRoot.java:509)
06-19 18:44:22.419: E/AndroidRuntime(467):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:177)
06-19 18:44:22.419: E/AndroidRuntime(467):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
06-19 18:44:22.419: E/AndroidRuntime(467):  at android.app.Dialog.show(Dialog.java:241)
06-19 18:44:22.419: E/AndroidRuntime(467):  at com.jlennon.gametest.PlayGameActivity.onCreateDialog(PlayGameActivity.java:131)
06-19 18:44:22.419: E/AndroidRuntime(467):  at android.app.Activity.onCreateDialog(Activity.java:2472)
06-19 18:44:22.419: E/AndroidRuntime(467):  at android.app.Activity.createDialog(Activity.java:881)
06-19 18:44:22.419: E/AndroidRuntime(467):  at android.app.Activity.showDialog(Activity.java:2547)
06-19 18:44:22.419: E/AndroidRuntime(467):  at android.app.Activity.showDialog(Activity.java:2514)
06-19 18:44:22.419: E/AndroidRuntime(467):  ... 15 more

提前多多感谢您!

6 个答案:

答案 0 :(得分:2)

试试此代码

 protected Dialog onCreateDialog(int id) {
  Dialog dialog;
  switch(id) {
   case 0:
    dialog = new Dialog(this);

    dialog.setContentView(R.layout.paused);
    dialog.setTitle("Game Paused");
    dialog.show();
    break;
default:
    dialog = null;
}
return null;

}

我刚刚将dialog = new Dialog(getApplicationContext())替换为dialog = new Dialog(this);

答案 1 :(得分:2)

Dialog dialog = new Dialog(YourActivity.this);
dialog.show();

而不是上面的代码。

我会用这个。

AlertDialog.Builder dialog = AlertDialog.Builder(this);

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View v = inflater.inflate(R.layout.yourlayout,null,false);

dialog.setView(v);

dialog.show();

顺便说一下,onCreateDialog(int)已被弃用;

答案 2 :(得分:2)

我创建了一个CustomDialog。喜欢这个..

enter image description here

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="match_parent" >

    <LinearLayout
        android:id="@+id/createpost_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/cre"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:gravity="center_horizontal"
            android:text="CREATE POST"
            android:textColor="@color/mytextcolor"
            android:textSize="20sp" />

        <EditText
            android:id="@+id/topic_ev"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:background="@drawable/txt_field"
            android:hint="topic" />

        <EditText
            android:id="@+id/description_ev"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:background="@drawable/destxt_field"
            android:hint="description"
            android:inputType="textMultiLine" />

        <Button
            android:id="@+id/upload_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="left"
            android:layout_margin="10dp"
            android:background="@drawable/upload_btn" />

        <TextView
            android:id="@+id/textu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:text="UPLOAD A FILE JPEG,GIF OR PNG 3MB Max"
            android:textSize="10sp" />
    </LinearLayout>

    <LinearLayout
        android:id="@+id/layout_forbuttons"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/createpost_layout"
        android:layout_margin="10dp"
        android:orientation="horizontal" >

        <Button
            android:id="@+id/post_btn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:layout_weight="1"
            android:background="@drawable/post_btn" />

        <Button
            android:id="@+id/cancel_btn"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:layout_weight="1"
            android:background="@drawable/cancel_btn" />
    </LinearLayout>

</RelativeLayout>

和CustomDialogClass是

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

import com.example.fragmentaltdd.R;

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

    public Activity c;
    public Dialog d;
    public Button Post, Cancel,Upload;

    public CustomDialogClass(Activity a)
    {
        super(a);

        this.c = a;
    }

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);


        requestWindowFeature(Window.FEATURE_NO_TITLE);

        setContentView(R.layout.createpost);

        Post = (Button) findViewById(R.id.post_btn);

        Cancel = (Button) findViewById(R.id.cancel_btn);

        Upload = (Button)findViewById(R.id.upload_btn);

        Post.setOnClickListener(this);

        Cancel.setOnClickListener(this);

        Upload.setOnClickListener(this);

    }

    @Override
    public void onClick(View v)
    {
        switch (v.getId())
        {
            case R.id.post_btn:
              //c.finish();
                Toast.makeText(c, "Post button clikced", Toast.LENGTH_LONG).show();
              break;

            case R.id.upload_btn:
                 // c.finish();
                Toast.makeText(c, "Upload button clikced", Toast.LENGTH_LONG).show();
                  break;

            case R.id.cancel_btn:
              dismiss();
              break;

            default:
              break;
        }
        dismiss();
    }
}

并像这样称呼它

    CustomDialogClass cdd = new CustomDialogClass(getActivity());//while calling from fragment

CustomDialogClass cdd = new CustomDialogClass(YourActivity.this);//while calling from Activity

            cdd.show();

答案 3 :(得分:1)

首先,您使用该方法是错误的。 createDialog方法的要点是创建对话框然后返回它。您在方法中显示对话框,然后根本不返回它,这完全违背了覆盖该方法的目的。你真的应该有自己的方法来创建和显示你的对话框。

其次,正如AVD在您的问题的评论中发布的那样,对于针对Honeycomb(11)或更高版本的API的应用,不推荐使用这种显示对话框的方法。

但是,您的问题是,您正在使用应用ContextgetApplicationContext())对象来显示属于您Activity的对话框。您应该传递this而不是使用Activity上下文,这将解决您的错误。

答案 4 :(得分:0)

试试这样:

import android.app.AlertDialog;

new AlertDialog.Builder(YourActivityName.this)
    .setTitle("Game Paused")
    .setPositiveButton("OK", null)
    .show();

答案 5 :(得分:0)

文档说:

  

Dialog类是用于创建对话框的基类。       但是,您通常不应直接实例化Dialog。       相反,您应该使用以下子类之一:

     

AlertDialog

     

ProgressDialog

     

DatePickerDialog

     

TimePickerDialog

来源:http://developer.android.com/guide/topics/ui/dialogs.html

Google似乎没有在此文档或Dialog类的实际API参考上说明这一点。正如您已经知道的那样,错误消息也没有。所以我不确定为什么班级没有“受保护”。

无论如何,使用上述类之一应解决您的问题。

如果有人知道为什么我们不能直接使用Dialog类,请发表评论。