rexo

پیاده سازی دکمه برگشت در فرگمنت

6 ارسال در این موضوع قرار دارد

سلام به همگی...

مسقیم میرم سر اصل مطلب:

من داخل یکی از فرگمنتهایی که پیاده سازی کردم، یک دکمه قرار دادم که با زدن اون یک layout رو با دستور:

layout.setVisibility(View.VISIBLE);

نمایش میدم، حالا میخوام با زدن دکمه برگشت این layout بسته بشه ولی متد onBackPressed رو نمیشه توی فرگمنت پاده سازی کرد!!!!

چجوری میتونم این کار رو انجام بدم؟!!!

ممنون از راهنماییتون.

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

متد OnBackPressed روی اکتیویتی پیاده سازی میشود

با این روش میتوانید مشکل رو حل کنید

 

1-یک کلاس interface ایجاد کنید

public interface OnBackPressedListener {
    public void doBack();
}

2-در این مرحله یک کلاس ایجاد کنید برای مدیریت back که در ادامه برای فرگمنت مورد استفاده قرار میگیرد

public class BaseBackPressedListener implements OnBackPressedListener {
    private final FragmentActivity activity;

    public BaseBackPressedListener(FragmentActivity activity) {
        this.activity = activity;
    }

    @Override
    public void doBack() {
        activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }
}

3- در داخل اکتیویتی زیر کلاس زیر را فراخوانی کنید

protected OnBackPressedListener onBackPressedListener;

4-در متد OnBackPressed کلاس onBackPressed را برای کلید back قرار میدهیم

@Override
public void onBackPressed() {
    if (onBackPressedListener != null)
        onBackPressedListener.doBack();
    else
        super.onBackPressed();

5- در مرحله آخر درداخل فرگمنت کلید back را که در اکتیویتی ایجاد کرده بودیم را به فرگمنت ارجاع میدهیم

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    activity = getActivity();

    ((BaseActivity)activity).setOnBackPressedListener(new BaseBackPressedListener(activity));

    View view = ... ;
//stuff with view

    return view;
}

 

 

2 کاربر پسند شده است

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
در 44 دقیقه قبل، Farzad Sarseifi گفته است :

متد OnBackPressed روی اکتیویتی پیاده سازی میشود

با این روش میتوانید مشکل رو حل کنید

 

1-یک کلاس interface ایجاد کنید


public interface OnBackPressedListener {
    public void doBack();
}

2-در این مرحله یک کلاس ایجاد کنید برای مدیریت back که در ادامه برای فرگمنت مورد استفاده قرار میگیرد


public class BaseBackPressedListener implements OnBackPressedListener {
    private final FragmentActivity activity;

    public BaseBackPressedListener(FragmentActivity activity) {
        this.activity = activity;
    }

    @Override
    public void doBack() {
        activity.getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }
}

3- در داخل اکتیویتی زیر کلاس زیر را فراخوانی کنید


protected OnBackPressedListener onBackPressedListener;

4-در متد OnBackPressed کلاس onBackPressed را برای کلید back قرار میدهیم


@Override
public void onBackPressed() {
    if (onBackPressedListener != null)
        onBackPressedListener.doBack();
    else
        super.onBackPressed();

5- در مرحله آخر درداخل فرگمنت کلید back را که در اکتیویتی ایجاد کرده بودیم را به فرگمنت ارجاع میدهیم


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    activity = getActivity();

    ((BaseActivity)activity).setOnBackPressedListener(new BaseBackPressedListener(activity));

    View view = ... ;
//stuff with view

    return view;
}

 

 

سلام

مرسی از پاسختون من تمام کارهایی که گفتید رو پیاده سازی کردم ولی متاسفانه نتیجه ای نداد!!!

همون عمکرد سابق رو داشت وقتی دکمه برگشت رو میزدم

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

حتما باید توجه کنید داشته باشید دستور

 super.onBackPressed();

را بعد از چک کردن دستوری که میخواهید اجرا شود قرار دهید

 

 

 

1 کاربر پسند دیده است

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

ارسال شده در (ویرایش شده)

در 39 دقیقه قبل، rexo گفته است :

سلام

مرسی از پاسختون من تمام کارهایی که گفتید رو پیاده سازی کردم ولی متاسفانه نتیجه ای نداد!!!

همون عمکرد سابق رو داشت وقتی دکمه برگشت رو میزدم

سلام، اطلاعاتی که جناب مهندس سرسیفی ارائه کردن کاملا درست هست و حدس من اینه که شما به نسبت نیازتون کدها رو تغییر ندادید...

که البته این کار نیاز به مقداری تجربه و دانش در زمینه برنامه نویسی داره، من خودم از همین دستور العمل استفاده میکنم البته با اندکی تغییر، مثلا در کلاس BaseBackPressedListener میتونید متد doBack رو به شکل زیر تغییر بدید:

@Override
public void doBack (){
  if (!activity.getSupportFragmentManager().popBackStackImmediate()){
    activity.supportFinishAfterTransition();
    }
  }

در کلاس MainActivity باید متد setOnBackPressedListener رو پیاده سازی کنید، که به این صورت میتونید این کار رو انجام بدید:

public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener){
this.onBackPressedListener = onBackPressedListener;
}

و بعد با استفاده کردن از یه متد در کلاس فرگمنت عمل پیاده سازی دکمه برگشت رو انجام‌بدید:

public void manageOnBackPressed (){
  ((MainActivity) getActivity()).setOnBackPressedListener(new BaseBackPressedListener(getActivity()){
      @Override 
      public void doBack(){
         if (/*what ever*/){
             //what ever
             } else {
             super.doBack();
             }
  }

و بعد در بخش onCreateView مربوط به فرگمنت متد ()manageOnBackPressed رو قرار بدید...

ویرایش شده در توسط شاهرخ جهان زاده
1 کاربر پسند دیده است

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
در 1 ساعت قبل، شاهرخ جهان زاده گفته است :

سلام، اطلاعاتی که جناب مهندس سرسیفی ارائه کردن کاملا درست هست و حدس من اینه که شما به نسبت نیازتون کدها رو تغییر ندادید...

که البته این کار نیاز به مقداری تجربه و دانش در زمینه برنامه نویسی داره، من خودم از همین دستور العمل استفاده میکنم البته با اندکی تغییر، مثلا در کلاس BaseBackPressedListener میتونید متد doBack رو به شکل زیر تغییر بدید:


@Override
public void doBack (){
  if (!activity.getSupportFragmentManager().popBackStackImmediate()){
    activity.supportFinishAfterTransition();
    }
  }

در کلاس MainActivity باید متد setOnBackPressedListener رو پیاده سازی کنید، که به این صورت میتونید این کار رو انجام بدید:


public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener){
this.onBackPressedListener = onBackPressedListener;
}

و بعد با استفاده کردن از یه متد در کلاس فرگمنت عمل پیاده سازی دکمه برگشت رو انجام‌بدید:


public void manageOnBackPressed (){
  ((MainActivity) getActivity()).setOnBackPressedListener(new BaseBackPressedListener(getActivity()){
      @Override 
      public void doBack(){
         if (/*what ever*/){
             //what ever
             } else {
             super.doBack();
             }
  }

و بعد در بخش onCreateView مربوط به فرگمنت متد ()manageOnBackPressed رو قرار بدید...

ممنونم، من تا بخوام تجربه کسب کنم حالا حالاها باید وقت بذارم :)

مشکلم با تغییراتی که شما دادید حل شد

به اشتراک گذاری این پست


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال نظر یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید نظر ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در انجمن ما ثبت نام کنید. عضویت خیلی ساده است !


ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید


ورود به حساب کاربری

  • مطالب مشابه

    • توسط hamed629
      دوستان چندین روز است که من درگیر این مشکل هستم من با کاتلین مینویسم :من دو تا آداپتور دارم که دوتا ریسایکلر ویوی من را پر میکنند چون دارم تست میزنم دو تا آداپتور مثل هم هستند با تفاوت اندکی، در قسمت ViewHolder های آداپتورها ، من تابع init دارم که داخلش setOnClickListenerهست که برای یک آداپتور روی عکس ها زدم و برای اون یکی روی تکست.....یک اکتیویتی دارم و یک فرگمنت حالا مشکل اینجاست که setOnClickListener آداپتور متصل به MainActivity وقتی کلیک میکنم روش کار میکنه ولی مال Fragment انگار pause شده .....لاگ گذاشتم قبل از setOnClickListener توی فرگمنت تا سر این تابع میاد ولی بعد انگار قفل میشه و هرچی کلیک میکنی تغییری حاصل نمیشه حالا جالب اینه که جای آداپتورهای فرگمنت و اکتیویتی را باهم عوض کردم و دیدم کار میکنه پس نتیجه اینکه کدها درست هستند ولی فرگمنت درست عمل نمیکنه خودم احساس میکنم که توی چرخه حیات،فرگمت وقتی منتظر کلیک کاربر میمونه پاز میشه و بعد از کلیک فعال نمیشه ولی اکتیویتی بقول خودمون گوش به زنگه ....من هم نمیدونم باید چکار کرد اگه دوستان راهی دارند لطف کنند که دیگه دارم کلافه میشم.ممنون
       
    • توسط peymangg
      سلام
      من تقریبا تازه اندروید رو شروع کردم و قبلش برنامه نویسی وب انجام میدادم
      داخل برنامه نویسی وب از الگو mvc یا امثال اینها استفاده می کردیم که منظم بود و لایه هارو از هم جدا میکرد.
      وقتی وارد برنامه نویسی اندروید شدم با این چند تا گزینه برای ساختار برنامه روبه رو شدم
      1. اینکه برای هر قسمت از برنامه یه اکتیویتی بسازم ( که به نظر خودم خیلی شلوغ و به هم ریخته می شه و سخت میشه نرم افزار رو نگه داری کرد)
      2. فقط یک اکتیوتی داشته باشم و قسمت های مختلف رو داخل فرگمنت پیاده کنم و اونارو داخل اکتیویتی اضافه کنم
      3. یکمی که سرچ زدم چند تا پست پیدا کردم که گفته بودم کارهایی که داخل فرگمنت می شه انجام داد رو با کاستوم ویو (custom view) میشه راحت تر انجام داد و چند تا کتابخانه و فریمورک برای این کار معرفی کرده بود مثل  mortar , flow, flowless, conductor و گفته بود که فرگمنت پیچیدگی مربوط به لایف سایکل داره و استفاده از کاستوم ویو بهتره
      لینک ها:
      https://medium.com/square-corner-blog/advocating-against-android-fragments-81fd0b462c97
      https://github.com/bluelinelabs/Conductor
      https://medium.com/inloopx/using-android-fragments-in-2018-b9cf0b05b718
       
      یکمی دچار سردرگمی شدم که کدوم بهتره برای ساخت نرم افزار با این که من تجربه ای ندارم می خواستم از کسایی که اپ اندرویدی که الان دست کاربر هست و استفاده می کنه بپرسم که برای ساختار برنامتون از چه چیزی هایی استفاده می کنید و اگه از گزینه ی بهتری استفاده می کنید معرفی کنید
       
      پ.ن 1: من می خوام یه نرم افزار حسابداری بنویسم و تقریبا قسمت های زیادی داره.
      پ.ن 2: محیط برنامه نویسی من اندروید استادیو + کاتلین هست.
    • توسط meysam1677
      سلام دوستان
      من یک کلاس main دارم. که در اون یک فرگمنت اجرا میشه. در این فرگمنت هم از طریق یک آداپتر یک لیست پر میشه.
      حال اگه روی یک آیتم کلیک کنیم چه طوری میشه باید فرگمنت حاضر عوض بشه. به قولی باید جای خودشو به یه فرگمنت جدید بده
      چه طوره باید پیاده سازی بشه؟

      ممنون از پاسختون
      خیلی اضطراریه 
    • توسط SamanH
      با سلام و عرض ادب و خسته نباشید
      یک  سوال مهم داشتم ، خیلی از سایت ها ، آموزش ها ، فیلم ها رو حتی در سایت های خارجی تماشا کردم و هرکدوشون درباره اتصال فرگمنت به Bottombar کتابخانه دیزاین (( Support Design Library))) ی چیز گفته بودن ، و من وقتی اونها را انجام می دادم ، همیشه یک جای کار خراب بود و یجورایی باگ به وجود می اومد..
       
      سوال من اینه که چجوری فرگمنت ها رو به BottomBar متصل کنیم و وقتی رو هرکدومشون کلیک می کنیم ، یک فرگمنت اجرا بشه ، مثل برنامه کافه بازار !!!!!!
       
      ممنون میشم لطف کنید یک آموزش کاملی قرار بدید تا بتونم درستش کنم!!!
       
      ًضروریه !!!
       
      متشکرم....
    • توسط SamanH
      با سلام و عرض ادب و خسته نباشید
      یک  سوال مهم داشتم ، خیلی از سایت ها ، آموزش ها و فیلم ها هم در وب سایت های ایرانی و خارجی تماشا کردم و هرکدوشون درباره اتصال فرگمنت به Bottombar کتابخانه دیزاین (( Support Design Library))) ی چیز گفته بودن ، و من وقتی اونها را انجام می دادم ، همیشه یک جای کار خراب بود و یجورایی باگ به وجود می اومد..
       
      سوال من اینه که چجوری فرگمنت ها رو به BottomBar وصل کنیم و وقتی رو هرکدومشون کلیک می کنیم ، یک فرگمنت اجرا بشه ، مثل برنامه کافه بازار !!!!!!
       
      ممنون میشم لطف کنید یک آموزش کاملی قرار بدید تا بتونم درستش کنم!!!
       
      ًضروریه !!!

  • دوره آموزشی اندروید آموزش ویدئویی اندروید سورس اندروید دوره اندروید آموزش Kotlin آموزش برنامه نویسی ios مهارت های فروش طراحی اپلیکیشن کوردینا موزیک Kurdina Music موزیک کردی Android Framework
  • فایل