فراخوانی یک متد موجود داخل کلاس فرگمنت از کلاس خارجی
سلام دوستان
فرض کنید یک کلاس فرگمنت بدین صورت داریم :
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 را فراخوانی کنیم؟
نقل قول: فراخوانی یک متد موجود داخل کلاس فرگمنت از کلاس خارجی
نقل قول:
نوشته شده توسط
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 هم پیاده سازی کنید.
یک نکته ! این تغییرات که گذاشتم تست نکردم چون تو یک تکست ادیتور نوشتم نتونستم تو اندروید تست کنم!
نقل قول: فراخوانی یک متد موجود داخل کلاس فرگمنت از کلاس خارجی
ممنون از توجهتون ..متاسفانه با خطا روبرو شدم نمیدونم اینو چطوری حل کنم :
لطف میکنید در مورد پیاده سازی با کلاس abstract هم یک نمونه مثال بزنید
نقل قول: فراخوانی یک متد موجود داخل کلاس فرگمنت از کلاس خارجی
نقل قول:
نوشته شده توسط
samiasoft
ممنون از توجهتون ..متاسفانه با خطا روبرو شدم نمیدونم اینو چطوری حل کنم :
لطف میکنید در مورد پیاده سازی با کلاس abstract هم یک نمونه مثال بزنید
بله ! شرمنده ایراد از سورس کد هست!
تعریف اینترفیس MyVirtualMethods را که در کلاس داخلی تعریف شده در یک فایل دیگر تعریف کنید!