活动中的Android片段和isFinishing

时间:2018-04-06 11:31:35

标签: android android-fragments android-alertdialog

在我的应用程序中,我在viewpager中使用了一些片段。 我想在这样的片段中显示一个对话框:

final Dialog dialog = new Dialog(activity, R.style.DialogTheme);
dialog.show();

活动在onCreateView中设置如下:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        activity = getActivity();
}

这是完美的工作,但在某些情况下,如果应用程序进入后台,并且用户回到应用程序,我在“dialog.show()”行中收到错误“Fragment not attached to activity”

所以为了防止这个错误我使用这个:

if(!activity.isFinishing())
   dialog.show();
else
   Toast.makeText(activity, "Error", Toast.LENGTH_SHORT).show();

我认为这绝对不是最好的方式......

如果活动是完整的,甚至是更好的解决方案,是否有可能重新加载应用程序的解决方案?

3 个答案:

答案 0 :(得分:0)

覆盖onAttach方法

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

        if (activity instanceof YourActiivty) {
               //here is your code
        } else {

        } 
    }

答案 1 :(得分:0)

public class MyFragment extends Fragment
        @Override
        public void setMenuVisibility(final boolean visible) {
            super.setMenuVisibility(visible);
            if (visible) {
                ...
            }
        }

答案 2 :(得分:0)

尝试使用DialogFragment而不是通过Dialog类显示对话框,它将为您提供更稳定的视图,只需通过" DialogFragment"

扩展您的课程
public class DemoDialogFragment extends DialogFragment{

    public DemoDialogFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View rootView = inflater.inflate(R.layout.fragment_demo_dialog, container, false);

                 -----------
        return rootView;
    }

并在你的活动中使用函数来调用它

public void showDialogFrag(DialogFragment dialogFragment, String tag) {
        dialogFragment.show(getSupportFragmentManager(), tag);
    }

然后通过任何片段

调用此函数
    ((MainActivity) getActivity()).showDialogFrag(new DemoDialogFragment(), Constant.FragmentTags.DemoDialogFragment);