DialogFragment的简单示例 - 示例代码对我不起作用

Tsa*_*mba 4 android android-fragments android-dialogfragment

请原谅我的无知,这是我作为Android开发人员工作的第一周.虽然我有几年的Java,但我在Android世界中是一个完整的菜鸟.

我只是想创建一个对话框并显示它.从研究中,我发现这是首选的方法:

https://developer.android.com/guide/topics/ui/dialogs.html

所以,我走了那条路,一起拍了一个基本的例子,跑步时我得到一个例外:

09-11 11:57:28.914:E/AndroidRuntime(1217):致命异常:主09-11 11:57:28.914:E/AndroidRuntime(1217):进程:com.myapp.mobile,PID:1217 09-11 11:57:28.914:E/AndroidRuntime(1217):java.lang.RuntimeException:无法启动活动ComponentInfo {com.myapp.mobile/com.myapp.mobile.MainActivity}:java.lang.IllegalStateException:活动已被销毁09-11 11:57:28.914:E/AndroidRuntime(1217):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)09-11 11:57:28.914:E/AndroidRuntime(1217):在android. app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)09-11 11:57:28.914:E/AndroidRuntime(1217):at android.app.ActivityThread.access $ 800(ActivityThread.java:135)09-11 11:57 :28.914:E/AndroidRuntime(1217):在android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1196)09-11 11:57:28.914:E/AndroidRuntime(1217):在android.os.Handler. dispatchMessage(Handler.java:102)09-11 11:57:28.914:E/AndroidRuntime(1217):在android.os.Loope r.loop(Looper.java:136)09-11 11:57:28.914:E/AndroidRuntime(1217):在android.app.ActivityThread.main(ActivityThread.java:5017)09-11 11:57:28.914: E/AndroidRuntime(1217):at java.lang.reflect.Method.invokeNative(Native Method)09-11 11:57:28.914:E/AndroidRuntime(1217):at java.lang.reflect.Method.invoke(Method. java:515)09-11 11:57:28.914:E/AndroidRuntime(1217):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)09-11 11:57:28.914: E/AndroidRuntime(1217):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)09-11 11:57:28.914:E/AndroidRuntime(1217):at dalvik.system.NativeStart.main (Native方法)09-11 11:57:28.914:E/AndroidRuntime(1217):引起:java.lang.IllegalStateException:活动已被破坏09-11 11:57:28.914:E/AndroidRuntime(1217):at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1345)09-11 11:57:28.914:E/AndroidRuntime(1217):在android.app.BackStackRecord.commitInternal(BackStackRecord.java:597)09-11 11:57:28.914:E/AndroidRuntime(1217):在android.app.BackStackRecord.commit(BackStackRecord.java:575)09-11 11:57:28.914:E/AndroidRuntime(1217):at android.app.DialogFragment.show(DialogFragment.java:230)09-11 11:57:28.914:E/AndroidRuntime(1217):at com.myapp.mobile.dialog.ActivationDialog.show(ActivationDialog.java:25)09 -11 11:57:28.914:E/AndroidRuntime(1217):at com.myapp.mobile.activate.Activation.ActivationCheck(Activation.java:11)09-11 11:57:28.914:E/AndroidRuntime(1217):在com.myapp.mobile.MainActivity.onCreate(MainActivity.java:20)09-11 11:57:28.914:E/AndroidRuntime(1217):at android.app.Activity.performCreate(Activity.java:5231)09- 11 11:57:28.914:E/AndroidRuntime(1217):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)09-11 11:57:28.914:E/AndroidRuntime(1217):在android.app. ActivityThread.performLaunchActivity(ActivityThread.java:2159)09-11 11:57:28.914:E/AndroidRuntime(1217):... 11更多

MainActivity的电话:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    //check user activation
    ActivationDialog dialog = new ActivationDialog();
    dialog.show();
}
Run Code Online (Sandbox Code Playgroud)

ActivationDialog类:

public class ActivationDialog extends FragmentActivity implements BaseDialogFragment.BaseDialogListener
{
    public ActivationDialog()
    {
    }

    @Override
    public void onDialogPositiveClick(DialogFragment dialog)
    {
    }

    @Override
    public void onDialogNegativeClick(DialogFragment dialog)
    {
    }

    public void show()
    {
        BaseDialogFragment dialogFrag = new BaseDialogFragment();
        dialogFrag.show(this.getFragmentManager(), "activationDialog");
    }
}
Run Code Online (Sandbox Code Playgroud)

基类:

public class BaseDialogFragment extends DialogFragment
{
    public interface BaseDialogListener
    {
        public void onDialogPositiveClick(DialogFragment dialog);
        public void onDialogNegativeClick(DialogFragment dialog);
    }

    BaseDialogListener dialogListener;

    @Override
    public void onAttach(Activity activity)
    {
        super.onAttach(activity);

        try
        {
            dialogListener = (BaseDialogListener)activity;
        }
        catch (ClassCastException e)
        {
            throw new ClassCastException(activity.toString() + " must implement NoticeDialogListener");
        }
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());

        builder.setMessage(R.string.dialog_base_message).setPositiveButton(R.string.dialog_base_ok, new DialogInterface.OnClickListener()
        {
            public void onClick(DialogInterface dialog, int id)
            {
            }
        }).setNegativeButton(R.string.dialog_base_cancel, new DialogInterface.OnClickListener()
        {
            public void onClick(DialogInterface dialog, int id)
            {
            }
        });

        return builder.create();
    }
}
Run Code Online (Sandbox Code Playgroud)

Tsa*_*mba 5

我通过反复试验找到了一种更好的方法,并通过实例捕捉.我认为.我不知道这样做是否有缺点,但这是有效的.我现在要尝试添加控件和事件,但这回答了我原来的问题.

自定义DialogFragment:

public class MyDialogFragment extends DialogFragment
{
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        return new AlertDialog.Builder(getActivity())
            .setTitle("Dialog Title")
            .setPositiveButton("OK", null)
            .create();
    }
}
Run Code Online (Sandbox Code Playgroud)

显示对话框:

public class MainActivity extends ActionBarActivity
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        MyDialogFragment myDiag = new MyDialogFragment();
        myDiag.show(getFragmentManager(), "Diag");
    }
}
Run Code Online (Sandbox Code Playgroud)