Используется для добавления фрагмента A в фрагмент B и возврата с результатом к фрагменту A [дубликат]

Рассказ: почтальона просят вернуться домой домой и получить обложки (письма, документы, чеки, подарочные карты, приложения, любовью) с адресом, написанным на нем для доставки.

Предположим, что есть нет обложки и попросите человека повести домой домой и получить все вещи и доставить другому человеку почтальон может запутаться,

, так что лучше оберните его обложкой (в нашей истории это интерфейс), тогда он

Теперь почтальон должен получать и доставлять только обложки .. (он не беспокоился о том, что внутри обложки).

Создайте тип interface не действительный тип, но реализуется с фактическим типом.

Создать для интерфейса означает, что ваши компоненты легко вставляются в остальную часть кода

Я приведу вам пример.

у вас есть интерфейс AirPlane, как показано ниже.

interface Airplane{
    parkPlane();
    servicePlane();
}

Предположим, что у вас есть методы в вашем классе контроллеров Planes, например

parkPlane(Airplane plane)

и

servicePlane(Airplane plane)

реализованы в вашей программе. Это не BREAK ваш код. Я имею в виду, что он не должен меняться, пока он принимает аргументы как AirPlane.

Поскольку он будет принимать любой самолет, несмотря на фактический тип, flyer, highflyr, fighter и т. Д. .

Кроме того, в коллекции:

List<Airplane> plane; // Возьмем все ваши самолеты.

Следующий пример очистит ваше понимание.


У вас есть истребитель, который его реализует, поэтому

public class Fighter implements Airplane {

    public void  parkPlane(){
        // Specific implementations for fighter plane to park
    }
    public void  servicePlane(){
        // Specific implementatoins for fighter plane to service.
    }
}

То же самое для HighFlyer и другой классы:

public class HighFlyer implements Airplane {

    public void  parkPlane(){
        // Specific implementations for HighFlyer plane to park
    }

    public void  servicePlane(){
        // specific implementatoins for HighFlyer plane to service.
    }
}

Теперь подумайте, что ваш контроллер классы, использующие AirPlane несколько раз,

Предположим, что ваш класс Controller - это ControlPlane, как показано ниже,

public Class ControlPlane{ 
 AirPlane plane;
 // so much method with AirPlane reference are used here...
}

здесь магия появляется как

, вы можете сделать свой новый AirPlane, и вы не меняете

код класса ControlPlane.

вы можете добавить экземпляр ..

JumboJetPlane // implementing AirPlane interface.
AirBus        // implementing AirPlane interface.

вы также можете удалить экземпляры ранее созданных типов.

3
задан jarlh 2 September 2015 в 07:53
поделиться

2 ответа

При общении с фрагментом на фрагмент вы используете интерфейс для передачи данных в Activity, который, в свою очередь, обновляет фрагмент, который вы хотите изменить.

Пример:

В фрагменте 1 :

public class FragmentOne extends Fragment{

  public Callback mCallback;

  public interface Callback{
       void onUpdateFragmentTwo(String message);
  }


   @Override
   public void onAttach(Activity activity){
     super.onAttach(activity);
     mCallback = (Callback) activity;
   }

   @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,
      Bundle savedInstanceState) {
        View v=inflater.inflate(R.layout.fragone, container,false);
        Button btn = (Button) v.findViewById(R.id.button1); 
        btn.setOnClickListener(new OnClickListener() {           
            @Override
           public void onClick(View v) {
               mCallback.onUpdateFragmentTwo("clicked");
            }     
        });
     return v;
  }
}

, затем в основном Управлении реализует интерфейс:

public class MainActivity extends AppCompatActivity implements Callback{

  FragmentTwo fragmentTwo;
  @Override
  public void onCreate(Bundle savedInstanceState){
     super.onCreate(savedInstanceState);
     setContentView(R.layout.main);

     // ... Load views or perform logic

     // ... Load Fragment Two into your container
     if(savedInstanceState == null){
         fragmentTwo = FragmentTwo.newInstance(new Bundle()); // use real bundle here
         getSupportFragmentManager()
             .beginTransaction()
             .add(R.id.fragment_holder, fragmentTwo, "Frag2").commit();
     }
  }


  // Interface method
  @Override
  public void onUpdateFragmentTwo(String message){
     // Call activity method with the argument
     if(fragmentTwo != null){
          fragmentTwo.updateFragmentTwo(message);
     }
  }

}

Обновить

Во втором фрагменте I как правило, используют статический метод newInstance (Bundle args) для инициализации, а затем используют публичный метод для связи из Activity to the Fragment, например:

 public class FragmentTwo extends Fragment{

      public static FragmentTwo newInstance(Bundle args){
          FragmentTwo fragment = new FragmentTwo();
          fragment.setArguments(args);
          return fragment;
      }

      //... Class overrides here onCreateView etc..

      // declare this method 
      public void updateFragmentTwo(String updateText){
         // .. do something with update text
      }

 }

Вот оно, счастливое кодирование!

1
ответ дан kandroidj 22 August 2018 в 21:52
поделиться

Здесь у вас есть то, о чем говорит Android-документация о «Общение между фрагментами» . Здесь вы будете иметь все необходимые шаги, чтобы сделать два или более фрагментов безопасно обмениваться данными:)

2
ответ дан arodriguezdonaire 22 August 2018 в 21:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: