Рассказ: почтальона просят вернуться домой домой и получить обложки (письма, документы, чеки, подарочные карты, приложения, любовью) с адресом, написанным на нем для доставки.
Предположим, что есть нет обложки и попросите человека повести домой домой и получить все вещи и доставить другому человеку почтальон может запутаться,
, так что лучше оберните его обложкой (в нашей истории это интерфейс), тогда он
Теперь почтальон должен получать и доставлять только обложки .. (он не беспокоился о том, что внутри обложки).
Создайте тип 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.
вы также можете удалить экземпляры ранее созданных типов.
При общении с фрагментом на фрагмент вы используете интерфейс для передачи данных в 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
}
}
Вот оно, счастливое кодирование!
Здесь у вас есть то, о чем говорит Android-документация о «Общение между фрагментами» . Здесь вы будете иметь все необходимые шаги, чтобы сделать два или более фрагментов безопасно обмениваться данными:)