Взаимодействие между Activity и фрагментом производится, как правило, через интерфейс. К примеру, в прошлой теме MainActivity выводила список объектов, и теперь определим удаление из этого списка через диалоговое окно.
Для этого добавим в проект интерфейс Removable:
package com.example.dialogsapp; public interface Removable { void remove(String name); }
Единственный метод интерфейса remove получает удаляемый объект в виде параметра name.
Теперь реализуем этот интерфейс в коде MainActivity:
package com.example.dialogsapp; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import java.util.ArrayList; public class MainActivity extends AppCompatActivity implements Removable{ private ArrayAdapter<String> adapter; @Override public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); setContentView(R.layout.activity_main); ListView phonesList = findViewById(R.id.phonesList); ArrayList<String> phones = new ArrayList<>(); phones.add("Google Pixel"); phones.add("Huawei P9"); phones.add("LG G5"); phones.add("Samsung Galaxy S8"); adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, phones); phonesList.setAdapter(adapter); phonesList.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { String selectedPhone = adapter.getItem(position); CustomDialogFragment dialog = new CustomDialogFragment(); Bundle args = new Bundle(); args.putString("phone", selectedPhone); dialog.setArguments(args); dialog.show(getSupportFragmentManager(), "custom"); } }); } @Override public void remove(String name) { adapter.remove(name); } }
Метод remove просто удаляет из адаптера переданный элемент.
Файл activity_main.xml по прежнему определяет только элемент ListView:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/phonesList" android:layout_width="match_parent" android:layout_height="match_parent" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintLeft_toLeftOf="parent" app:layout_constraintBottom_toBottomOf="parent" /> </androidx.constraintlayout.widget.ConstraintLayout>
И в конце определим фрагмент CustomDialogFragment:
package com.example.dialogsapp; import android.app.AlertDialog; import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.os.Bundle; import androidx.annotation.NonNull; import androidx.fragment.app.DialogFragment; public class CustomDialogFragment extends DialogFragment { private Removable removable; @Override public void onAttach(Context context){ super.onAttach(context); removable = (Removable) context; } @NonNull public Dialog onCreateDialog(Bundle savedInstanceState) { final String phone = getArguments().getString("phone"); AlertDialog.Builder builder=new AlertDialog.Builder(getActivity()); return builder .setTitle("Диалоговое окно") .setIcon(android.R.drawable.ic_dialog_alert) .setMessage("Вы хотите удалить " + phone + "?") .setPositiveButton("OK", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { removable.remove(phone); } }) .setNegativeButton("Отмена", null) .create(); } }
Метод onAttach()
вызывается в начале жизненного цикла фрагмента, и именно здесь мы можем получить контекст фрагмента, в качестве которого
выступает класс MainActivity. Так как MainActivity реализует интерфейс Removable, то мы можем преобразовать контекст к данному интерфейсу.
Затем в обработчике кнопки ОК вызывается метод remove объекта Removable, который удаляет переданный во фрагмент объект phone.