从ArrayAdapter中启动FragmentTransaction

The*_*ter 6 android android-arrayadapter android-fragments

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

我想按钮启动FragmentTransaction来替换ListView所在的Fragment.

但是,在该getView()方法中Adapter,此行不起作用:

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

它不喜欢上下文.

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

Mel*_*pes 34

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

FragmentTransaction ft = ((FragmentActivity)context).getSupportFragmentManager().beginTransaction();
Run Code Online (Sandbox Code Playgroud)


Tus*_*har 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();
}
Run Code Online (Sandbox Code Playgroud)


Myk*_*dai 5

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

public class YourAdapter extends...

    private FragmentManage mFragmentManager;        

    public YourAdapter(FragmentManager fm) {
        mFragmentManager = fm;
    }
Run Code Online (Sandbox Code Playgroud)

并明确使用它:

FragmentTransaction ft = mFragmentManager.beginTransaction();
Run Code Online (Sandbox Code Playgroud)

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