PDA

View Full Version : فراخوانی یک متد موجود داخل کلاس فرگمنت از کلاس خارجی



samiasoft
دوشنبه 15 مرداد 1397, 14:25 عصر
سلام دوستان

فرض کنید یک کلاس فرگمنت بدین صورت داریم :

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 را فراخوانی کنیم؟

farhad_shiri_ex
دوشنبه 15 مرداد 1397, 16:57 عصر
سلام دوستان

فرض کنید یک کلاس فرگمنت بدین صورت داریم :

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 هم پیاده سازی کنید.
یک نکته ! این تغییرات که گذاشتم تست نکردم چون تو یک تکست ادیتور نوشتم نتونستم تو اندروید تست کنم!

samiasoft
سه شنبه 16 مرداد 1397, 22:12 عصر
ممنون از توجهتون ..متاسفانه با خطا روبرو شدم نمیدونم اینو چطوری حل کنم :

http://s9.picofile.com/file/8333857368/2018_08_07_223859.jpg


لطف میکنید در مورد پیاده سازی با کلاس abstract هم یک نمونه مثال بزنید

farhad_shiri_ex
چهارشنبه 17 مرداد 1397, 11:10 صبح
ممنون از توجهتون ..متاسفانه با خطا روبرو شدم نمیدونم اینو چطوری حل کنم :

http://s9.picofile.com/file/8333857368/2018_08_07_223859.jpg


لطف میکنید در مورد پیاده سازی با کلاس abstract هم یک نمونه مثال بزنید

بله ! شرمنده ایراد از سورس کد هست!
تعریف اینترفیس MyVirtualMethods را که در کلاس داخلی تعریف شده در یک فایل دیگر تعریف کنید!