Вопрос по eclipse, android, java, dialog – Android-Show Custom Dialog

1

В моем приложении для 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

Большое спасибо заранее!

Да! Посмотри на -mkyong.com/android/android-custom-dialog-example adatapost
Этот метод устарел. Использовать DialogFragment -developer.android.com/reference/android/app/DialogFragment.html adatapost
Похоже, что большая часть кода эффективна. Могу я просто вызвать dialog.show ()? Я попробовал это, но это все еще не работает. user1404512

Ваш Ответ

6   ответов
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 = новый диалог (getApplicationContext ()) на диалог = новый диалог (это);

Humbugiddy-dumbug. Боже, это сработало! user1404512
1

createDialog Метод заключается в том, чтобы создать диалог и затем вернуть его. Вы показываете диалоговое окно внутри метода, а не возвращаете его вообще, что полностью отрицает цель переопределения этого метода. Вы действительно должны иметь свой собственный метод, который создает и отображает ваш диалог.

Во-вторых, как AVD разместил в комментариях к вашему вопросу, этот метод отображения диалогов не рекомендуется для приложений, ориентированных на API для Honeycomb (11) или более поздней версии.

Однако ваша проблема заключается в том, что вы используете ПриложениеContext (getApplicationContext()) объект для отображения диалога, который должен принадлежать вашемуActivity, Вы должны пройти вthis вместо того, чтобы использоватьActivity контекст и это исправит вашу ошибку.

2

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();
0

The Dialog class is the base class for creating dialogs. However, you typically should not instantiate a Dialog directly. Instead, you should use one of the following subclasses:

AlertDialog

ProgressDialog

DatePickerDialog

TimePickerDialog

источник:http://developer.android.com/guide/topics/ui/dialogs.html

Похоже, что Google не дает объяснения этому в этом документе или фактической ссылке на API для класса Dialog. И, как вы уже знаете, сообщение об ошибке также не отображается. Поэтому я не уверен, почему класс не «защищен».

В любом случае, использование одного из вышеперечисленных классов должно решить вашу проблему.

Прокомментируйте, если кто-нибудь знает, почему мы не можем использовать класс Dialog напрямую.

0

import android.app.AlertDialog;

new AlertDialog.Builder(YourActivityName.this)
    .setTitle("Game Paused")
    .setPositiveButton("OK", null)
    .show();
Прочтите ОП. Он / она говорит о настраиваемом диалоге.
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) устарела;

Похожие вопросы