6

いくつListViewかの行があります。各行には。がありbuttonます。

ListViewが含まれているFragmentを置き換えるために、ボタンでFragmentTransactionを開始する必要があります。

ただし、の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。したがって、型のオブジェクトで呼び出しを呼び出そうとすると、コンパイラは呼び出しを解決できません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 に答える