2016-11-01 2 views
0

Мой проект работает с навигационной деятельностью, которая использует фрагменты для отдельных страниц меню. Я бы хотел открыть другие фрагменты, нажав кнопку (в отличие от значка меню навигации), однако я не могу понять, как это сделать. Я рассмотрел оба следующих ресурса (и многое другое), но я не совсем понимаю их.Android Studio: перемещение между фрагментами и действиями внутри фрагментов

How can I make my button to do something in Fragments,ViewPager https://developer.android.com/training/basics/fragments/communicating.html

Кроме того, при нажатии на кнопку будет также позвонить по коду в основной деятельности, который использует панель приложения.

Если кто-то может объяснить мне, как добиться желаемого эффекта, это было бы здорово.

ответ

0

Если вы хотите открыть фрагмент, нажав кнопку из фрагмента, вызов должен пройти текущую операцию.

Создайте обратный вызов активности и вызовите этот обратный вызов при нажатии кнопки. Затем Activity запускает второй фрагмент при вызове обратного вызова.

Таким образом, первый фрагмент не должен знать ничего о втором фрагменте. Действие касается навигации между фрагментами в одной и той же деятельности.

Я думаю, что это самое простое и простое решение.

Редактировать: Я в основном говорю то же самое, что ссылка на документацию по андроиду, размещенную в вопросе. Я думаю, что это лучшее решение.

0

Для простоты: активность = [А], фрагмент 1 = [B] и Фрагмент 2 = [С]

Шаг 1: Создание интерфейса внутри [B], называется IOnInitiate[C]Listener, и в пределах этого интерфейса создают метод под названием void Initiate[C]();.

Шаг 2: Создайте частную собственность в [B] типа IOnInitiate[C]Listener под названием (your-prefix-convention)OnInitiate[C]Listener.

Шаг 3: Создать публичный метод в [B], называется public void SetInitiate[C]Listener(Activity activity) и бросили параметр activity в частной собственности, созданной на шаге 2.

Шаг 4: [А] должен реализовать интерфейс [B].IOnInitiate[C]Listener и метод public void Initiate[C]().

Шаг 5: из [A], когда вы создаете новый экземпляр [B], обязательно вызовите метод с шага 3 и перейдите в this для параметра Activity. В противном случае произойдет исключение null.

Шаг 6: Теперь, когда вам нужно инициировать [C] из [B], просто вызовите метод интерфейса из частной собственности [B]. Пример: (prefix)OnInitiate[C]Listener.Initiate[C]();

Это то, на что похожа моя. Я использую C# для своей разработки, поэтому ваш синтаксис может отличаться.

public class A : Activity, B.IOnInitiateCListener 
{ 
    private void InitiateB() 
    { 
     B b = new B(); 
     b.SetInitiateCListener(this); 
     b.Show(FragmentManager, "B"); 
    } 

    public void InitiateC() 
    { 
     C c = new C(); 
     c.Show(FragmentManager, "C"); 
    } 
} 

public class B : Fragment 
{ 
    public interface IOnInitiateCListener 
    { 
     void InitiateC(); 
    } 

    private IOnInitiateCListener _IOnInitiateCListener; 

    public void SetInitiateCListener(Activity activity) 
    { 
     _IOnInitiateCListener = (IOnInitiateCListener)activity; 
    } 

    private void InitiateC() 
    { 
     _IOnInitiateCListener.InitiateC(); 
    } 
} 
Смежные вопросы