getActivity() 在片段的 AlertDialog 中为 null

Posted

技术标签:

【中文标题】getActivity() 在片段的 AlertDialog 中为 null【英文标题】:getActivity() is null inside AlertDialog of a fragment 【发布时间】:2014-09-12 22:04:26 【问题描述】:

为什么 getActivity()AlertDialog 内返回 null ?

这是班级 -

Class A extends Common

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 
        Button save = (Button) view.findViewById(R.id.save);
        save.setOnClickListener(new OnClickListener() 

        @Override
        public void onClick(View v) 

        System.out.println("the activity outside dialog.."+getActivity());

        AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
        alert.setPositiveButton("Check acitivity", 
        new DialogInterface.OnClickListener() 
            public void onClick(DialogInterface dialog, 
            int whichButton) 
            dialog.cancel();
            System.out.println("the activity inside dialog.."+getActivity());
            
         );
      

Common 类将片段扩展为 -

import android.support.v4.app.Fragment;
Class Common extends Fragment

  //Some code

输出是 -

the activity outside dialog..com.testapp.main.MainActivity@42131080
the activity inside dialog..null

【问题讨论】:

那么代码在哪个方法中,在片段的生命周期中的哪个位置? @laalto - 更新了代码。它位于单击 Save 按钮时的 onCreateView 方法内。 【参考方案1】:
 Activity activity;
@Override
public void onAttach(Activity activity) 
    super.onAttach(activity);
    this.activity=activity;

【讨论】:

不要这样做!这可能会泄漏活动。 @BraisGabin 那么解决办法是什么?【参考方案2】:

我认为 DialogInterface 中的 getActivity() 指向对话框的上下文

dialog.getActivity()

在您的 DialogInterface 中尝试将其更改为:

A.this.getActivity();

编辑:我检查了 DialogInterface 中的 getActivity(),它应该可以正常工作。

另一种解决方案可能是使用 onAttach 回调函数并在那里获取您的活动上下文,以确保您的片段在对话框中使用之前附加到父活动。然后使用它而不是 getActivity()。

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

【讨论】:

是指向对话框的上下文,我猜不是,否则他将无法编译事件 这仍然给出相同的结果 - null。 @blackbelt:提一下,我已经检查了 DialogInterface 中的 getActivity() 应该可以正常工作。 @VedPrakash : 你确定你没有使用支持库吗? @Arash - 我正在使用支持库 - FragmentActivity android.support.v4.app.Fragment.getActivity()。会有什么不同?【参考方案3】:

将 getActivity() 替换为 A.this

AlertDialog.Builder alert = new AlertDialog.Builder(A.this);

【讨论】:

编译时错误 - The constructor AlertDialog.Builder(A) is undefined.【参考方案4】:

getActivity() 在 Fragment 未附加到活动之前返回 null。

你假设在 onAttach 方法调用之后创建对象。

您可以在onCreateview 方法中创建对象以获得最佳实践。

【讨论】:

【参考方案5】:
Why the getActivity() is returning null inside AlertDialog ?

那是因为你调用的是 DialogInterface.OnClickListener 的 getActivity() 而不是你的 in 片段,因此给你 null。

解决方案:

A.this.getActivity();

您需要使用this 调用您的类的引用并调用方法getActivity()

编辑:

@Override
        public void onClick(View v) 

    System.out.println("the activity outside dialog.."+getActivity());

    AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());
    alert.setPositiveButton("Check acitivity", 
    new DialogInterface.OnClickListener() 
        public void onClick(DialogInterface dialog, 
        int whichButton) 
        System.out.println("the activity inside dialog.."+ A.this.getActivity());
        dialog.cancel();
        
     );

【讨论】:

getActivity 返回承载fragment的activity,有什么区别? @blackbelt 他在匿名类中调用它,然后调用它的 getactivity 方法,该方法将返回 null 这仍然给出相同的结果 - null。 好吧,我猜这是java中closure的概念,但我仍然认为这不是原因 @Rod_Algonquin - 除了刷 S.O.P. 之外,它有什么不同? dialog.cancel() 的声明?我仍然是空的。【参考方案6】:

基于 Sudhi S 和 Arash 的回答,我认为这是一个更简洁的选项,可以在本地处理 Activity 到调用它的方法:

private void showDialog() 
    final Activity activity = getActivity();
    AlertDialog.Builder builder = new AlertDialog.Builder(activity)
            .setTitle(R.string.my_title)
            .setMessage(R.string.my_message)
            .setNegativeButton(android.R.string.cancel, null)
            .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() 
                @Override
                public void onClick(DialogInterface dialog, int which) 
                    Log.e(TAG, "the activity inside dialog... " + activity);
                
            );
    final AlertDialog dialog = builder.create();
    dialog.setCanceledOnTouchOutside(true);
    dialog.show();

【讨论】:

以上是关于getActivity() 在片段的 AlertDialog 中为 null的主要内容,如果未能解决你的问题,请参考以下文章

Android getActivity() 总是在片段内返回 null

安卓。片段 getActivity() 有时返回 null

片段 getActivity() 与接口回调?

Android 片段 getActivity() = null

方向更改后片段中的 getActivity() 为空

(Android Studio)不能在片段中使用 context/getActivity() [重复]