نوشته شده توسط
samiasoft
سلام دوستان
فرض کنید یک کلاس فرگمنت بدین صورت داریم :
public class profile_Fragment extends Fragment {
Button btn_load;
ImageView image_1;
public profile_Fragment() {
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_profile, container, false);
init(view);
return view;
}
private void init(View view)
{
btn_load = view.findViewById(R.id.btn_load);
image_1 = view.findViewById(R.id.image_1);
btn_load.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Downloader downloader = new Downloader();
downloader.start();
}
});
}
public void check(){
}
}
و یک کلاس خارجی بدین صورت :
public class Downloader (){
public void start(){
}
}
حال سوالی که داشتم این هستش که داخل تابع start چگونه تابع check را فراخوانی کنیم؟
روش الصاق فرگمنت به اکتیویتی اگر به صورت زیر هست.
profile_Fragment fragment = new profile_Fragment ();
fragment.setArguments(arguments);
getSupportFragmentManager().beginTransaction()
.add(R.id.item_detail_container, fragment)
.commit();
خوب تو اکتیویتی به راحتی به آبجکت فرگمنت که دسترسی دارید(()profile_Fragment fragment = new profile_Fragment) و صد البته به متدهای فر گمنت خودتون...
حالا اگر در زمان اجرا فرگمنت ها را اضافه میکنید یعنی با استفاده از کلاس FragmentPagerAdapter یعنی یک کلاس wrapper دارید که توی اون تعریف میکنید که فرگمنت ها فعال بشن خوب یکم سخت می تونید به فرگمنتی که می خواهید دسترسی داشته باشید چون این کلاس مسول ساختن شی و اضافه کردن فرگمنت به اکتیویتی هست برای همین بهترین کار اینه هست که یک اینترفیس در فرگمنت تعریف کنید و تو اکتیویتی ویا هر کلاسی که می خواهید پیاده سازی کنید مثلا
public class profile_Fragment extends Fragment implements MyVirtualMethods{
Button btn_load;
ImageView image_1;
public profile_Fragment() {
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_profile, container, false);
init(view);
return view;
}
private void init(View view)
{
btn_load = view.findViewById(R.id.btn_load);
image_1 = view.findViewById(R.id.image_1);
btn_load.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Downloader downloader = Downloader.newInstance((MyVirtualMethods) profile_Fragment.this);
downloader.start();
}
});
}
@Override
public void check(){
//write this code herer!
}
public interface MyVirtualMethods{
void check();
}
}
public static class Downloader {
private MyVirtualMethods mMethods;
private Downloader (MyVirtualMethods methods){
this.mMethods = methods;
}
public static Downloader newInstance(MyVirtualMethods methods){
return new Downloader(methods);
}
public void start(){
//call back to virtual method.
mMethods.check();
}
}
البته می تونید با کلاس abstract هم پیاده سازی کنید.
یک نکته ! این تغییرات که گذاشتم تست نکردم چون تو یک تکست ادیتور نوشتم نتونستم تو اندروید تست کنم!