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