我有ListView几行。每行都有一个button.
我希望按钮启动一个 FragmentTransaction 来替换 ListView 所在的 Fragment。
但是,在 的getView()方法中Adapter,这一行不起作用:
FragmentTransaction t = getContext().getSupportFragmentManager().beginTransaction();
它不喜欢上下文。
这可以通过这种方式完成还是交易必须在其他地方发生?
我有ListView几行。每行都有一个button.
我希望按钮启动一个 FragmentTransaction 来替换 ListView 所在的 Fragment。
但是,在 的getView()方法中Adapter,这一行不起作用:
FragmentTransaction t = getContext().getSupportFragmentManager().beginTransaction();
它不喜欢上下文。
这可以通过这种方式完成还是交易必须在其他地方发生?
首先在构造函数中获取上下文,然后尝试以下代码,
FragmentTransaction ft = ((FragmentActivity)context).getSupportFragmentManager().beginTransaction();
getSupportFragmentManager()只为类定义FragmentActivity,不为Context. 因此,如果您尝试在 type 的对象上调用它,编译器将无法解析该调用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();
}
我建议你像这样将FragmentManager实例传递给Adapter构造函数:
public class YourAdapter extends...
private FragmentManage mFragmentManager;
public YourAdapter(FragmentManager fm) {
mFragmentManager = fm;
}
并明确使用它:
FragmentTransaction ft = mFragmentManager.beginTransaction();
Adapter这应该使您可以使用其中一个Fragment.getFragmentManager()或实例进行初始化FragmentActivity.getSupportFragmentManager(),因为它们指向同一个对象