Взаимодействие между 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.