6

我有ListView几行。每行都有一个button.

我希望按钮启动一个 FragmentTransaction 来替换 ListView 所在的 Fragment。

但是,在 的getView()方法中Adapter,这一行不起作用:

FragmentTransaction t = getContext().getSupportFragmentManager().beginTransaction();

它不喜欢上下文。

这可以通过这种方式完成还是交易必须在其他地方发生?

4

3 回答 3

34

首先在构造函数中获取上下文,然后尝试以下代码,

FragmentTransaction ft = ((FragmentActivity)context).getSupportFragmentManager().beginTransaction();
于 2013-10-09T10:32:42.337 回答
12

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();
}
于 2013-03-11T01:18:20.457 回答
5

我建议你像这样将FragmentManager实例传递给Adapter构造函数:

public class YourAdapter extends...

    private FragmentManage mFragmentManager;        

    public YourAdapter(FragmentManager fm) {
        mFragmentManager = fm;
    }

并明确使用它:

FragmentTransaction ft = mFragmentManager.beginTransaction();

Adapter这应该使您可以使用其中一个Fragment.getFragmentManager()或实例进行初始化FragmentActivity.getSupportFragmentManager(),因为它们指向同一个对象

于 2013-03-11T00:35:42.367 回答