zoukankan      html  css  js  c++  java
  • The method dismissDialog(int) from the type Activity is deprecated

     

    The method showDialog(int) from the type Activity is deprecated.

    enter image description here

    What's the reason? and how to solve it?

    7down voteaccepted

    What's the reason?

    http://developer.android.com/reference/android/app/Activity.html#showDialog(int)

    Android DialogFragment vs Dialog

    How to solve it?

    Use the new DialogFragment class with FragmentManager instead; this is also available on older platforms through the Android compatibility package.

    http://android-developers.blogspot.in/2012/05/using-dialogfragments.html

    share|improve this answer
     

    Google recommends that we use DialogFragment instead of a simple Dialog by using Fragments API, but it is absurd to use an isolated DialogFragment for a simple Yes-No confirmation message box. What is the best practice in this case?

    share|improve this question
     

    4 Answers

    Yes use DialogFragment and in onCreateDialog you can simply use an AlertDialog builder anyway to create a simple AlertDialog with Yes/No confirmation buttons. Not very much code at all.

    With regards handling events in your fragment there would be various ways of doing it but I simply define a message Handler in my Fragment, pass it into the DialogFragment via its constructor and then pass messages back to my fragment's handler as approprirate on the various click events. Again various ways of doing that but the following works for me.

    In the dialog hold a message and instantiate it in the constructor:

    private Message okMessage;
    ...
    okMessage = handler.obtainMessage(MY_MSG_WHAT, MY_MSG_OK);

    Implement the `onClickListener' in your dialog and then call the handler as appropriate:

    public void onClick(.....
        if (which == DialogInterface.BUTTON_POSITIVE) {
            final Message toSend = Message.obtain(okMessage);
            toSend.sendToTarget();
        }
     }

    Edit

    And as Message is parcelable you can save it out in onSaveInstanceState and restore it

    outState.putParcelable("okMessage", okMessage);

    Then in onCreate

    if (savedInstanceState != null) {
        okMessage = savedInstanceState.getParcelable("okMessage");
    }
    share|improve this answer
     
    1  
    How do you persist okMessage? The problem is that when the activity is restarted (orientation change or whatever), your custom constructor is not called and thus your okMessage will be null. –  hrnt Nov 2 '11 at 11:59
    1  
    The problem is not okMessage - the problem is okMessage's target which will be null if you load it from a Bundle. If the target of a Message is null, and you use sendToTarget, you will get a NullPointerException - not because the Message is null, but because its target is. –  hrnt Nov 2 '11 at 12:44
    4  
    Why We should be using DialogFragment instead of plain Dialogs ????? –  Amit Nov 10 '12 at 7:03
    1  
    What the advantages of using DialogFragment instead of a Dialog? –  Raphael Petegrosso Dec 7 '12 at 14:43
    13  
    The advantage of using a DialogFragment is that all the life cycle of the dialog will be handled for you. You will never get the error 'dialog has leaked...' again. Go to DialogFragment and forget Dialogs. –  Snicolas Mar 13 '13 at 10:06
     

    I would recommend using DialogFragment.

    Sure, creating a "Yes/No" dialog with it is pretty complex considering that it should be rather simple task, but creating a similar dialog box with Dialog is surprisingly complicated as well.

    (Activity lifecycle makes it complicated - you must let Activity manage the lifecycle of the dialog box - and there is no way to pass custom parameters e.g. the custom message to Activity.showDialog if using API levels under 8)

    The nice thing is that you can usually build your own abstraction on top of DialogFragment pretty easily.

    share|improve this answer
     
        
    How you will handle alert dialog callbacks (yes, no)? –  Alexey Zakharov Nov 2 '11 at 8:49 
        
    The easiest way would be to implement a method in the hosting Activity that takes a String parameter. When the user clicks "Yes", for example, the dialog calls the Activity's method with parameter "agree". These parameters are specified when showing the dialog, for example AskDialog.ask("Do you agree to these terms?", "agree", "disagree"); –  hrnt Nov 2 '11 at 8:54
    3  
    But i need callback inside fragment, not activity. I can use setTargetFragment and cast it to interface. But it is hell. –  Alexey Zakharov Nov 2 '11 at 8:59
        
    You could also fetch the target fragment by setting a tag to the target and using FragmentManager's findFragmentByTag. But yeah, it requires a fair bit of code. –  hrnt Nov 2 '11 at 9:53

    Use DialogFragment over AlertDialog:


    • Since the introduction of API level 13:

      the showDialog method from Activity is deprecated. Invoking a dialog elsewhere in code is not advisable since you will have to manage the the dialog yourself (e.g. orientation change).

    • Difference DialogFragment - AlertDialog

      Are they so much different? From Android reference regarding DialogFragment:

      A DialogFragment is a fragment that displays a dialog window, floating on top of its activity's window. This fragment contains a Dialog object, which it displays as appropriate based on the fragment's state. Control of the dialog (deciding when to show, hide, dismiss it) should be done through the APIhere, not with direct calls on the dialog.

    • Other notes

      • Fragments are a natural evolution in the Android framework due to the diversity of devices with different screen sizes.
      • DialogFragments and Fragments are made available in the support library which makes the class usable in all current used versions of Android.
    share|improve this answer
     

    You can create generic DialogFragment subclasses like YesNoDialog and OkDialog, and pass in title and message if you use dialogs a lot in your app.

    public class YesNoDialog extends DialogFragment
    {
        public YesNoDialog()
        {
    
        }
    
        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState)
        {
            Bundle args = getArguments();
            String title = args.getString("title", "");
            String message = args.getString("message", "");
    
            return new AlertDialog.Builder(getActivity())
                .setTitle(title)
                .setMessage(message)
                .setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_OK, null);
                    }
                })
                .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener()
                {
                    @Override
                    public void onClick(DialogInterface dialog, int which)
                    {
                        getTargetFragment().onActivityResult(getTargetRequestCode(), Activity.RESULT_CANCELED, null);
                    }
                })
                .create();
        }
    }

    Then call it using the following:

        DialogFragment dialog = new YesNoDialog();
        Bundle args = new Bundle();
        args.putString("title", title);
        args.putString("message", message);
        dialog.setArguments(args);
        dialog.setTargetFragment(this, YES_NO_CALL);
        dialog.show(getFragmentManager(), "tag");

    And handle the result in onActivityResult.

    share|improve this answer
     
        
    can it work after activity being recreated (screen rotated) –  Malachiasz Jan 30 at 10:22
        
    Yes, DialogFragment handles all lifecycle events for you. –  ashishduh Jan 30 at 14:45
    1  
    I think it doesn't because after rotation old Dialog still exists and it keeps assignent to old not existing fragment (dialog.setTargetFragment(this, YES_NO_CALL);) so after rotation getTargetFragment().onActivityResult doesn't work –  Malachiasz Jan 30 at 15:21
        
    I use this code for all my dialogs and they work fine when screen is rotated. setTargetFragment uses FragmentManager methods to retain state of Fragments. –  ashishduh Jan 30 at 19:32 
        
    I think that only way for it to work is to have the Fragment setRetainInstance(true) or (Activity not being destroyed). And this is unwanted in many cases. –  Malachiasz Feb 3 at 10:20
  • 相关阅读:
    9多线程与异步
    5文件操作
    3C#面向对象概念
    2初步了解C#类与对象
    7Linq查询语言
    6字符编码
    8网络请求之http
    1初步了解C#语言基础
    4C#格式处理
    WPF及Silverlight中将DataGrid数据导出 南京酷得软件
  • 原文地址:https://www.cnblogs.com/flyingsir/p/3957883.html
Copyright © 2011-2022 走看看