2013-03-11 3 views
5

У меня есть ListView с несколькими строками. Каждая строка имеет button.Запустить FragmentTransaction изнутри ArrayAdapter

Я хочу кнопку, чтобы начать FragmentTransaction заменить фрагмент что ListView находится в

Однако в getView() способе Adapter, эта линия не работает:.

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

Это не нравится контекст.

Можно ли это сделать таким образом или сделка должна произойти в другом месте?

+0

Какую ошибку вы получаете, в частности? – Tushar

+0

Ошибка: 'Метод getSupportFragmentManager не определен для типа Context' – KickingLettuce

+0

Вы нашли подходящий ответ, если да, то каково было решение? – Lion789

ответ

10

getSupportFragmentManager() только для класса FragmentActivity, не для Context. Таким образом, компилятор не может разрешить вызов, если вы попытаетесь вызвать его на объект типа Context.

Вы можете использовать отражение, чтобы сделать это безопасным способом. Это всегда будет работать, пока вы передадите свой FragmentActivity как Context. Примечание. FragmentActivity - это подкласс контекста, и вы можете передавать FragmentActivity везде, где вы можете передать Context.

Так используйте этот код вместо:

if (getContext() instanceof FragmentActivity) { 
    // We can get the fragment manager 
    FragmentActivity activity = (FragmentActivity(getContext())); 
    FragmentTransaction t = activity.getSupportFragmentManager().beginTransaction(); 
} 
+0

Что делать, если это не экземпляр функции fragmentActivity, и это просто активность ... как вы это делаете? – Lion789

+0

@ Lion789 Ну без фрагментации не будет иметь FragmentManager и, следовательно, не будет 'getSupportFragmentManager' или' getFragmentManager', поэтому вы не сможете использовать фрагменты с ним. – Tushar

+0

Как можно использовать 'getSupportFragmentManager() .beginTransaction() .Надеть (R.id.content_frame, Fragment_home.newInstance(), Fragment_home.TAG) .commit();' в стороне массива adapter.it получать сообщение об ошибке при Я использую его в соответствии с вашим решением. – kosala

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() экземпляра, так как они направлены на один и тот же объект

+0

Выполнение 'public YourAdapter (FragmentManager fm) {' вызывает ошибку, которая говорит 'Неявный суперструктор ArrayAdapter () не определен. Должен ли косвенно ссылаться на другой конструктор? – KickingLettuce

+0

Итак, вы переопределяете 'ArrayAdapter'? Вы должны вызвать конструктор 'super()' с соответствующими параметрами. Если вы предоставите исходный код конструктора вашего адаптера, я могу предоставить точную строку –

29

Во-первых получить контекст в конструкторе, а затем попробуйте следующий код,

FragmentTransaction ft = ((FragmentActivity)context).getSupportFragmentManager().beginTransaction(); 
+0

Спасибо, он работает. –

+0

вы наиболее востребованы :) –

+0

Вы экономите мою жизнь, большое вам спасибо;) – hdiz

Смежные вопросы