我有一个ListView
有几行。每行都有一个button
。
我希望按钮启动FragmentTransaction以替换ListView所在的Fragment。
但是,在getView()
的{{1}}方法中,此行不起作用:
Adapter
它不喜欢上下文。
这可以通过这种方式完成,还是交易必须在其他地方进行?
答案 0 :(得分:33)
首先在构造函数中获取上下文,然后尝试使用代码
FragmentTransaction ft = ((FragmentActivity)context).getSupportFragmentManager().beginTransaction();
答案 1 :(得分:12)
getSupportFragmentManager()
仅为课程FragmentActivity
定义,而不是Context
。因此,如果您尝试在Context
类型的对象上调用它,则编译器无法解析该调用。
您可以使用反射以安全的方式执行此操作。只要您将FragmentActivity作为Context
传递,这将始终有效。注意:FragmentActivity是Context的子类,因此您可以在任何可以传递Context的地方传递FragmentActivity。
所以请改用此代码:
if (getContext() instanceof FragmentActivity) {
// We can get the fragment manager
FragmentActivity activity = (FragmentActivity(getContext()));
FragmentTransaction t = activity.getSupportFragmentManager().beginTransaction();
}
答案 2 :(得分:4)
我建议您将FragmentManager
实例传递给Adapter
构造函数:
public class YourAdapter extends...
private FragmentManage mFragmentManager;
public YourAdapter(FragmentManager fm) {
mFragmentManager = fm;
}
明确使用它:
FragmentTransaction ft = mFragmentManager.beginTransaction();
这应该让您可以使用Adapter
或Fragment.getFragmentManager()
实例初始化FragmentActivity.getSupportFragmentManager()
,因为它们指向同一个对象