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;
}

 

 

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

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


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
در 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 رو قرار بدید...

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

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

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


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

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

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

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

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


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

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

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


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

  • مطالب مشابه

    • توسط soroush80
      سلام دستان من به یه مشکلی خوردم من یه battom barدرست کردم و خب چند تا فرگمنت براش قرار دادم الان میخوام تو یکی از فرگمنت هام  toolbarبزارم نه تو کل برنامه اما چون فایل جاوای اون activity من به صورت extends fragmentهست خیلی از خواصAppCompatActivity رو نداره به همین خاطر نمیتونم toolbarرو بهش اظافه کنم میخواستم اگه میشه یا یه روش بهم بگید که fragment هم خواصAppCompatActivity رو پیدا کنه یا یه راه حل بهم بدید.
      خیلی ممنون.
    • توسط yasin133
      چطور میتونم از یک فرگمنت به یک اکتیویتی انتقال پیدا کنم. تو دیزاین فرگمنتم یه دکمه دارم که میخوام باهاش به یه اکتیویتی برم، اما تو کلاس فرگمنتم وقتی میخوام باتنو تعریف کنم ارور میده برای findviewbyid. ممنون میشم اگه کمکم کنید 
    • توسط Omid Zakeri
      بهترین روش برای تجزیه و تحلیل فرگمنت ها استفاده از Arguments در آندروید می باشد.( setArguments  )
      چند راه برای تجزیه و تحلیل و انتقال اطلاعات به فرگمنت ها در اندروید وجود دارد. با این حال، هنگامی که این کار را انجام می دهید، باید مراقب باشید و در هنگام نمونه برداری و انتقال داده ها به قطعات باید از روش های اشتباه اجتناب کنید.
      با این حال، این روش اشتباه است. از آنجا که هنگامی که برنامه شما به پس زمینه ارسال می شود و برنامه های دیگر نیاز به حافظه بیشتر و بیشتر دارند، پس برنامه و منابع آن از حافظه پاک می شود تا فضای جدید را باز کند.
      import android.os.Bundle; import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; /** * Sample fragment to demonstrate the instantiation of fragments with arguments * * Created by Günhan on 28.10.2015. */ public class MyFragment extends Fragment { private String name; private int age; private TextView mNameTextView; private TextView mAgeTextView; public static MyFragment newInstance(String name, int age) { Bundle bundle = new Bundle(); bundle.putString("name", name); bundle.putInt("age", age); MyFragment fragment = new MyFragment(); fragment.setArguments(bundle); return fragment; } private void readBundle(Bundle bundle) { if (bundle != null) { name = bundle.getString("name"); age = bundle.getInt("age"); } } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_sample, container, false); mNameTextView = (TextView) view.findViewById(R.id.nameTextView); mAgeTextView = (TextView) view.findViewById(R.id.ageTextView); readBundle(getArguments()); mNameTextView.setText(String.format("Name: %s", name)); mAgeTextView.setText(String.format("Age: %d", age)); return view; } } در این مثال، برای نمایش MyFragment باید از کد زیر استفاده کنید:
      Fragment fragment = MyFragment.newInstance("OMID", 27);  
    • توسط Razieh Shahraki
      همانگونه که در جریان قرار گرفته اید در 18 مارس 2013 ورژم دوم گوگل مپ  معرفی شد که دارای ویژگی های بسیاری بهتری نسبت به ورژن قبلی است. مانند پیدا کردن سریعتر موقعیت کاربر که بستگی به اینکه این موقعیت از GPS بدست امده یا WIFI و یا mobile data (موبایل دیتا) متغیر میباشد.
      GPS دقیق است  و بهترین نتیحه را برمیگرداند ولی عیب آن مصرف زیاد باطری دیوایس و کند بودن میباشد و غیر فعال بودن در مکان های سرپوشیده میباشد.اما WIFI ضعیفترین و غیر دقیق ترین نتیجه را برمیگرداند ولی خوبی آن مصرف کم باطری میباشد.
      مراحل مورد نیاز برای انجام پروژه:
      1-      ایجاد برنامه جدید(کامپایل با  Google Api)
      2-      وارد کردن کتابخانهGoogle Play Services
      3-       دریافت اثر انگشت SHA1 شما
      4-       دریافت mapKey خود را با استفاده از SHA1
      5-       اصلاح AndroidManifest.xml
      برنامه اندرویدی جدیدی ایجاد کنید.
      [align=center]http://www.codeproject.com/KB/android/614946/01.jpg[/img][/align]
      وارد کردن کتابخانهGoogle Play Services
      1-    کتابخانه google play services خود را که در مسیر زیر است پیدا کنید.
       ....\android-sdk\adt-bundle-windows-x86_64-20130522\adt-bundle-windows-x86_64-20130522\sdk\extras\google  
      و آن را به Workspace خود انتقال دهید.
      2-    کتابخانه را به محیط Eclipse وارد کنید.( File\Import\Existing Android Code Into Workspace )
      [align=center]http://www.codeproject.com/KB/android/614946/02.jpg[/img][/align]
      کتابخانه Google Play Services  را به روش زیر به پروژه خود اضافه کنید .
      روی پروژه کلیک راست  کرده سپس گزینه properties را انتخاب کنید به تب اندروید رفته و روی دکمه add کلیک کنید فقط کتابخانه Google Play Services را اضافه کرده و ok کنید.
      [align=center]http://www.codeproject.com/KB/android/614946/030.jpg[/img][/align]
      دریافت اثر انگشت SHA1 شما
      به مسیر زیر بروید:
      Window\Preferences   Android\Build
      اثر انگشت خود را پیدا کرده و کپی کنید.
      [align=center]http://www.codeproject.com/KB/android/614946/05.jpg[/img][/align]
      به پنجره کنسول  Google Apis بروید.
      [align=center]http://www.codeproject.com/KB/android/614946/06.jpg[/img][/align]
      پروژه جدیدی ایجاد کنید.
      [align=center][/align]
      گزینه Google Maps Android API V2 را فعال کنید.
      [align=center][/align]
      روی Create New Android Key کلیک کنید.
      [align=center]http://www.codeproject.com/KB/android/614946/09.jpg[/img][/align]
      SHA1 را وارد کنید و بعد از آن ; و نام پکیج برنامه.
      [align=center]http://www.codeproject.com/KB/android/614946/10.jpg[/img][/align]
      اصلاح فایل AndroidManifest.xml 
      1-    اضافه کردن تگ زیر قبل از تگ

       
      android:name="com.example.osman.permission.MAPS_RECEIVE" android:protectionLevel="signature"/> android:glEsVersion="0x00020000" android:required="true"/>  
      2-    اضافه کردن کد زیر قبل از تگ
      android:name="com.google.android.maps.v2.API_KEY" android:value="YOUR_KEY"/>  
      و MainActivity شما مانند  کد زیر باشد.

       
      import android.os.Bundle; import android.app.Activity; import android.support.v4.app.FragmentActivity; import android.view.Menu; public class MainActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }  
      برای استفاده از نشانگر در نقشه از کد زیر در فایلMainActivity استفاده کنید.

       
      GoogleMap googleMap; googleMap = ((SupportMapFragment)(getSupportFragmentManager().findFragmentById(R.id.map))).getMap(); LatLng latLng = new LatLng(-33.796923, 150.922433); googleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); googleMap.addMarker(new MarkerOptions() .position(latLng) .title("My Spot") .snippet("This is my spot!") .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_AZURE))); googleMap.getUiSettings().setCompassEnabled(true); googleMap.getUiSettings().setZoomControlsEnabled(true); googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 10));  
    • توسط Razieh Shahraki
      در این آموزش میخواهیم کار با فرگمنت رو انجام بدیم.
      برای این کار پروژه جدیدی ایجاد کرده.
      در فایل activity_main.xml کد زیر را قرار دهید.
      xmlns:tools="http://schemas.android.com/tools" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent" > android:name="balaji.fragment_static.Fragment1" android:id="@+id/fragment1" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> android:name="balaji.fragment_static.Fragment2" android:id="@+id/fragment2" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" />  
      فایل به اسم Fragment1.xml ایحاد کنید و کد زیر را در آن قرار دهید.
      xmlns:tools="http://schemas.android.com/tools" android:background="#7B68EE" android:layout_width="match_parent" android:layout_height="match_parent" > android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:textSize="30dp" android:text="Fragment 1" /> فایل دیگری به اسم Fragment2.xml ایجاد کنید و کد زیر را در آن قرار دهید.
       
      xmlns:tools="http://schemas.android.com/tools" android:background="#00FF00" android:layout_width="match_parent" android:layout_height="match_parent" > android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:textSize="30dp" android:text="Fragment 2" /> در فایل MainActivity.java کد زیر را قرار داده

       
      import android.os.Bundle; import android.app.Activity; import android.view.Menu; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }  
      در فایل Fragment1.java کد زیر را قرار داده
       
      import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class Fragment1 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment1, container, false); } }  
      در فایل Fragment2.java هم کد زیر را قرار دهید.
      import android.annotation.SuppressLint; import android.app.Fragment; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @SuppressLint("NewApi") public class Fragment2 extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.fragment2, container, false); } }  
       
      برنامه را اجرا کنید.
      خروجی برنامه به صورت زیر می باشد


  • دوره آموزشی اندروید ایران کانادا آموزش ویدئویی اندروید آموزش برنامه نویسی اندروید اندروید کاپ دوره آنلاین اندروید کتاب های آموزشی اندروید بسته آموزشی اندروید دوره برنامه نویسی اندروید آموزش Kotlin آموزش برنامه نویسی ios
  • فایل