سلام.
براساس ویدیوی این جلسه و مباحثی که تا الان یاد گرفتیم، میخوام چند روش برای پیاده سازی interface رو در کنار هم بیارم.
کلیت کلاس TaskDialog رو به شکل زیر در نظر میگیریم و روی همین کلاس کار میکنیم:
public class TaskDialog extends DialogFragment {
// some fields come here
private AddNewTaskCallback listener;
@NonNull
@Override
public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
// some codes come here
// ...
builder.setView(view);
return builder.create();
}
interface AddNewTaskCallback {
void onNewTask();
}
}
روش اول(پیاده سازی اینترفیس):
داخل کلاس TaskDialog یک constructor میسازیم و listener رو داخلش ست میکنیم.
// TaskDialog.java
public TaskDialog(AddNewTaskCallback listener) {
this.listener = listener;
}
اینترفیس AddNewTaskCallback رو داخل کلاس MainActivity پیاده سازی میکنیم:
// MainActivity.java
public class MainActivity extends AppCompatActivity implements TaskDialog.AddNewTaskCallback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TaskDialog dialog = new TaskDialog(this); // MainActivity.this
dialog.show(getSupportFragmentManager(), null);
}
@Override
public void onNewTask() {
// ...
}
}
اگر dialog در متد onClick ایجاد میشه، بجای this باید از MainActivity.this استفاده بشه.(چون this به listener کلیک اشاره میکنه.)
روش دوم:
مثل روش قبل همون constructor قبلی اومده:
// TaskDialog.java
public TaskDialog(AddNewTaskCallback listener) {
this.listener = listener;
}
شیءای از AddNewTaskCallback رو بعنوان پارامتر constructor پیاده میکنیم:
// MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TaskDialog dialog = new TaskDialog(new TaskDialog.AddNewTaskCallback() {
@Override
public void onNewTask() {
// ...
}
});
dialog.show(getSupportFragmentManager(), null);
}
}
روش سوم:
استفاده از setter برای پیاده سازی اینترفیس و مقدار دهی در کلاس TaskDialog:
// TaskDialog.java
public TaskDiaog setListener(AddNewTaskCallback listener) {
this.listener = listener;
return this;
}
TaskDialog بعنوان خروجی setter درنظر گرفتم تا از زنجیره ی متد استفاده کنم. میتونه خروجی void باشه و بصورت جدا setter رو call کنم.
میبینید که داخل setListener مقدار دهی شده:
// MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TaskDialog dialog = new TaskDialog()
.setListener(new TaskDialog.AddNewTaskCallback() {
@Override
public void onNewTask() {
// ...
}
});
dialog.show(getSupportFragmentManager(), null);
}
}
روش چهارم:
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
listener = (AddNewTaskCallback) context;
}
شبیه روش اول، فقط اینجا this رو پاس نمیدیم:
// MainActivity.java
public class MainActivity extends AppCompatActivity implements TaskDialog.AddNewTaskCallback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TaskDialog dialog = new TaskDialog();
dialog.show(getSupportFragmentManager(), null);
}
@Override
public void onNewTask() {
// ...
}
}
چند روش هم برای ارسال مقادیر به دیالوگ:
روش اول: روشی که استاد در ویدیوی این جلسه(پیاده سازی ویرایش) تدریس کردن(استفاده از parcelable)
روش دوم: پاس دادن مقادیر از طریق constructor یا ساخت متد setter.
روش سوم: ساخت کلاس اپلیکیشن:
کلاس App در تمام قسمتهای اپلیکیشن قابل دسترسیست و باید نام کلاس در AndroidManifest و اتریبیوت android:name=".App" تعریف شود.
فیلد currentTask تعریف شده:
// App.java
public class App extends Application {
public static Task currentTask;
@Override
public void onCreate() {
super.onCreate();
// ...
}
}
در کلاس TaskAdapter زمانیکه روی دکمه ی btnEdit کلیک شد، task مورد نظرو داخل فیلد currentTask از کلاس App میریزیم:
// TaskAdapter
findViewById(R.id.btnEdit).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
App.currentTask = task;
// ...
}
});
چون روی btnEdit کلیک شده، بنابراین براساس کدی که مینویسیم، EditTaskDialog ساخته میشه و میتونیم به currentTask جدید دسترسی داشته باشیم:
// EditTaskDialog.java
private Task task;
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
task = App.currentTask;
}