টুকরা জীবনচক্র - শো / আড়াল করার জন্য কোন পদ্ধতিটি বলা হয়?


103

আমি খণ্ডগুলি (আমার নেভিগেশনড্রেয়ারে) দেখিয়ে / লুকিয়ে রেখে তাদের মধ্যে পরিবর্তন করতে নিম্নলিখিত পদ্ধতিটি ব্যবহার করছি।

protected void showFragment(int container, Fragment fragment, String tag, String lastTag, boolean addToBackStack ) {

        FragmentManager fragmentManager = getSupportFragmentManager();
        FragmentTransaction transaction = fragmentManager.beginTransaction();

        if ( lastTag != null && !lastTag.equals("")) {
            Fragment lastFragment = fragmentManager.findFragmentByTag( lastTag );
            if ( lastFragment != null ) {
                transaction.hide( lastFragment );
            }
        }

        if ( fragment.isAdded() ) {
            transaction.show( fragment );
        }
        else {
            transaction.add( container, fragment, tag );
        }

        if ( addToBackStack ) {
            transaction.addToBackStack( tag );
        }

        transaction.commit();

        // set the active tag
        activeFragTag = tag;
    }

আমি যে বিষয়টি সম্পর্কে অস্পষ্ট তা হ'ল আমি যখন দেখাই বা লুকিয়ে রাখি তখন ফ্রেগমেন্টস লাইফাইসাইকেলের কোন পদ্ধতিটি বলা হয়? (যেহেতু onShow () বা onHide () এর মতো কোনও পদ্ধতি নেই তবে কী ব্যবহার করবেন তা আমি নিশ্চিত নই)। আমি নির্দিষ্ট কিছু খণ্ড প্রদর্শন করে এবং লুকিয়ে রেখে নির্দিষ্ট ক্রিয়া সম্পাদন করতে চাই।


আপনি কল যখন ) Fragment.show ( তারপর কিছু বিন্দু পরে এ টুকরা ট্রিগার onCreate(), দ্বারা অনুসরণ onCreateDialog(), দ্বারা অনুসরণonCreateView()
কেউ কোথাও

উত্তর:


123

ক্রিয়াকলাপের জীবনচক্রের অনুরূপ, অধ্যায় যখন দৃশ্যমান হয়ে যায় তখন অ্যান্ড্রয়েড কল করে স্টার্ট ()onStop()খণ্ডটি অদৃশ্য হয়ে গেলে সাধারণত বলা হয় তবে এটি পরে পরেও বলা যেতে পারে।

আপনার লেআউটের উপর নির্ভর করে অ্যান্ড্রয়েড onStart()এমনকি কল করতে পারে, যখন আপনার খণ্ডটি এখনও দৃশ্যমান নয়, তবে এটি দৃশ্যমান পিতামাতার ধারকের অন্তর্ভুক্ত। উদাহরণস্বরূপ, এটি বৈধ android.support.v4.view.ViewPagerযার জন্য আপনার প্রয়োজন Fragment.setUserVisibleHint()পদ্ধতি ওভাররাইড করা । যাইহোক, আপনার যদি ব্রডকাস্ট্রিজারিজ বা অন্যান্য শ্রোতাদের নিবন্ধন / নিবন্ধন করতে হয় তবে আপনি নিরাপদে onStart()এবং onStop()পদ্ধতিগুলি ব্যবহার করতে পারেন কারণ সেগুলি সর্বদা ডাকা হবে।

দ্রষ্টব্য: কিছু খণ্ড পাত্রে অদৃশ্য টুকরা শুরু রাখতে পারে। এই পরিস্থিতিটি পরিচালনা করতে আপনি ওভাররাইড করতে পারেন Fragment.onHiddenChanged(boolean hidden)ডকুমেন্টেশন অনুসারে , একটি খণ্ড অবশ্যই ব্যবহারকারীর কাছে দৃশ্যমান হতে, উভয়ই শুরু এবং দৃশ্যমান (লুকানো নয়) হতে হবে hidden

আপডেট: আপনি যদি ব্যবহার করেন android.support.v4.widget.DrawerLayoutতবে ড্রয়ারের নীচে একটি খণ্ড শুরু হয়ে যায় এবং ড্রয়ারটি খোলা থাকলেও দৃশ্যমান হয়। এই ক্ষেত্রে আপনার DrawerLayout.setDrawerListener()জন্য onDrawerClosed()এবং onDrawerOpened()কলব্যাকগুলি শুনতে এবং শুনতে হবে ।


16
onStopএবং onPauseবলা হয় না যখন একটি টুকরা একটি লেনদেন ব্যবহার অদৃশ্য হয়ে করা হয়। তবুও onHiddenChangeds1rius উত্তর হিসাবে প্রস্তাবিত হিসাবে বলা হয়
ইয়োন হারকিউট

এটি নেভিগেশনড্রেয়ারে কাজ করে না। onHidedChanged v4 / v11 সমর্থন lib কল করা হয় না। ড্রয়ার লেআউটটি খোলার পরে প্রতিবারই নয়, অনস্টার্ট এবং অন-রেসুমিকেও ডাকা হবে।
drdrej

@drdrej সমস্যাটি হ'ল ড্রয়ারটি সম্পূর্ণরূপে নীচে কোনও আড়াল করে না। আপনি যদি সহায়তা লাইব্রেরি থেকে ড্রয়ারলআউট ব্যবহার করেন তবে আপনার ড্রয়ারলিস্টনার ব্যবহার করা দরকার।
সার্জেজ শফেরেঙ্কা

71

আমি এই পদ্ধতিটি ওভাররাইড করি এবং আমার সমস্যাটি সমাধান করি:

@Override
public void onHiddenChanged(boolean hidden) {
    super.onHiddenChanged(hidden);
    if (hidden) {
        //do when hidden
    } else {
       //do when show
    }
}

4
কোনও সমাধানের চেষ্টা করা হয়নি তবে স্ট্যাকওভারফ্লোsetUserVisibleHint . com/a/18375436/1815624 কাজগুলিতে দেখানো হিসাবে ব্যবহার করা হয়েছে
CrandellWS

36

অবশ্যই আপনি এটি করতে নিম্নলিখিত পদ্ধতিটি ওভাররাইড করতে পারেন:

@Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {
            // Do your Work
        } else {
            // Do your Work
        }
    }

এবং সহজেই জানা যাবে যে টুকরাটি ব্যবহারকারীর কাছে দৃশ্যমান আছে কি না তা কল করেgetUserVisibleHint()
এআরআইএফ

4
setUserVisibleHint ভিউ পেজারের সাথে কাজ করে তবে নিয়মিত খণ্ড ধারক নয়।
মাইকেএল

ধন্যবাদ এই solves আমার সমস্যা :)
রাজেশ কুমার অরুমুগাম

এটি ভিউপ্যাজারে আমার জন্য কাজ করেছিল। onHidedChanged কাজ করেনি।
লাইভ-লাভ

আমার সমস্যার সমাধান!
জাদ চাহাইন

3

নিয়মিত খণ্ডের ধারক হিসাবে ভিউ পেজারের আচরণে খণ্ডগুলি পৃথক।

এই কোড ব্যবহার করে দেখুন:

    boolean mIsVisibleToUser;

    /**
     * is visible to user
     */
    public void show() {
        //do when show
    }

    /**
     * is invisible to user
     */
    public void hide() {
        //do when gone
    }

    @Override
    public void onResume() {
        super.onResume();
        if (!mIsVisibleToUser && getUserVisibleHint()) {
            mIsVisibleToUser = true;
            show();
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        if (mIsVisibleToUser && getUserVisibleHint()) {
            mIsVisibleToUser = false;
            hide();
        }
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isResumed()) {
            if (mIsVisibleToUser != isVisibleToUser) {
                mIsVisibleToUser = isVisibleToUser;
                if (isVisibleToUser) show();
                else hide();
            }
        }
    }

    public boolean isVisibleToUser() {
        return mIsVisibleToUser;
    }

2

এই কোড ব্যবহার করে দেখুন:

@Override
public void setUserVisibleHint(boolean visible)
{
    super.setUserVisibleHint(visible);
    if (visible && isResumed())
    {
         onResume();
    }
}

@Override
public void onResume()
{
    super.onResume();
    if (!getUserVisibleHint())
    {
        return;
    }

    //Add your code this section
}

2

আপনি 'অনক্রিয়েটভিউ' (বা 'onActivityCreated') এবং 'onHidedChanged' ব্যবহার করতে পারেন। প্রথম শোয়ের জন্য 'অনক্রিটভিউ' ব্যবহার করুন এবং পরে 'অন হিডেনচ্যাঞ্জড' ব্যবহার করুন। 'সেটমেনুভিজিবিলিটি' লেনদেন নিয়ন্ত্রণে কল করা হয় না।

@Override
public View OnCreateView() {
   // fragment will show first
}

@Override
public void onHiddenChanged(boolean hidden) {
    if (!hidden) {
        // fragment will show 
    }
    else {
        // fragment will hide
    }
}

onHmittedChanged () আমার খণ্ডের সাথে ডাকা হয় না
মাতদেব

1

আপনার সেট ইউজারভিজেবলহিন্টে এটি চেষ্টা করুন ()

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);
    if(isVisibleToUser && getView() != null){
        isActive = true;
        init();
    }else if(isVisibleToUser && getView() == null){
        isActive = false;
    }else{
        isActive = true;
    }
}

এবং অনক্রিটভিউতে এই কোডটি তৈরি করুন () :

public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  if(!isActive){
      init();
  }
}

isVisibleToUser && getView() != nullআমার জন্য নিখুঁত কাজ!
anni

1

খণ্ডটি দৃশ্যমান হওয়ার সময় ফ্রেগমেন্ট পদ্ধতিতে কল করার আর একটি উপায় এবং আপনি ক্রিয়াকলাপে ভিউপেজারটি ব্যবহার করেন।

// প্রথমে আপনি একটি ইন্টারফেস তৈরি করুন

public interface ShowFragmentVisible{
      public void showFragment();}

// এর পরে এই ইন্টারফেসটি ফ্র্যাগমেন্টের মতো প্রয়োগ করে

      public class MyFragment extends Fragment implements 
         ShowFragmentVisible {
            @Override
public void showFragment() {
}

// এখন আপনার ক্রিয়াকলাপটি চলে যায় তারপরে ইন্টারফেসের অবজেক্ট তৈরি করুন এবং অ্যাডঅনভিউপেজারলাইস্টেনারে প্রবেশ করুন

   ShowFragmentVisible showFragmentVisible;

@Override
public void onAttachFragment(Fragment fragment) {
    super.onAttachFragment(fragment);

    if (fragment instanceof ShowFragmentVisible) {
        showFragmentVisible = (ShowFragmentVisible) fragment;
    }

}
     //your viewpager method
    viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {
            if (position==0){
                showFragmentVisible.showFragment();

           }

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });


this is another alternative,but its work for me successfully

0

setUserVisibleHintআগে কল onCreateView। এবং আপনি ব্যবহারকারীর ভিজিবিলহিন্টের অভ্যন্তরে কোনও ভিউ আপডেট করতে পারবেন না

public void setMenuVisibility(final boolean visible)

দৃশ্যমানতার জন্য এবং onHmittedChanged () প্রথমবারের জন্য কল করেনি । যখন লুকানো অবস্থা পরিবর্তিত হয় তখন এটি কল করে। কারণ ক fragment is visible by default। এই পদ্ধতিটি অর্জন করার জন্য আপনাকে প্রথমবার কল mFragmentTransaction.hide(oldFragment)করতে হবে তবে এটি কাজ করবে

বিঃদ্রঃ

আপনি যদি সেট ইউজারভিজেবল ইঙ্গিত এবং আপডেটটি দেখতে চান তবে এই পদ্ধতিটি ব্যবহার করুন


0

অবশ্যই আপনি ওভাররাইড করতে পারেন setUserVisibleHintবা setMenuVisibilityতবে আপনার যদি অ্যাক্সেসের প্রয়োজন হয় Contextবা Activity, সেগুলি সেখানে বাতিল হয়ে যাবে! অন্য একটি পদ্ধতি রয়েছে onStartযা সর্বদা প্রাসঙ্গিক হাতে পাওয়া যায়, তবে এটি কেবল একবার খণ্ড তৈরির সময় বলা হবে এবং আপনি যদি টুকরার মধ্যে একটি পেজারে চলতে শুরু করেন তবে দেখতে পাবেন যে এটি দ্বিতীয় দৃষ্টিতে এবং তার পরে ডাকা হবে না ।

তাহলে এখন কি করতে হবে?

কর্মক্ষেত্রটি বেশ সহজ, onStartপ্রথম দর্শনের জন্য এবং setMenuVisibilityপরে দর্শকদের জন্য ব্যবহার করুন। আপনার কোডটি সম্ভবত নীচের মত দেখাবে:

খণ্ড বিভাগ:

public class MyFragmentClass{
    private boolean isCurrentVisible = false;
...

@Override
public void onStart() {
    super.onStart();
    if (isCurrentVisible)
        doSth();
}

@Override
public void setMenuVisibility(boolean menuVisible){
    super.setMenuVisibility(menuVisible);
    this.isCurrentVisible = menuVisible;
    if(menuVisible && getContext() != null)
        doSth();
}

এই উপায় Contextসর্বদা doSth()পদ্ধতিতে উপলব্ধ থাকবে ।


0

এটি কেবল আমার জন্য কাজ করেছিল !! এবং setUserVisibleHint(...)এখন অবচয় করা হয়েছে (আমি শেষ পর্যন্ত ডকগুলি সংযুক্ত করেছি), যার অর্থ অন্য কয়েকটি উত্তর হ্রাস করা হয়েছে ;-)

public class FragmentFirewall extends Fragment {
    /**
     * Required cause "setMenuVisibility(...)" is not guaranteed to be
     * called after "onResume()" and/or "onCreateView(...)" method.
     */
    protected void didVisibilityChange() {
        Activity activity = getActivity();
        if (isResumed() && isMenuVisible()) {
            // Once resumed and menu is visible, at last
            // our Fragment is really visible to user.
        }
    }

    @Override
    public void onResume() {
        super.onResume();
        didVisibilityChange();
    }

    @Override
    public void setMenuVisibility(boolean visible) {
        super.setMenuVisibility(visible);
        didVisibilityChange();
    }
}

পরীক্ষিত এবং NaviagationDrawerপাশাপাশি কাজ করে , isMenuVisible()সর্বদা ফিরে আসবে true(এবং onResume()যথেষ্ট বলে মনে হচ্ছে তবে আমরা সমর্থন ViewPagerকরতে চাই)।

setUserVisibleHintঅবচয় করা হয়। যদি এই পদ্ধতিটি ওভাররাইড করা হয় তবে পাস trueকরার Fragment.onResume()সময় প্রয়োগ করা আচরণগুলিতে স্থানান্তরিত হওয়া উচিত , এবং পাস করার সময় প্রয়োগ করা আচরণে falseস্থানান্তরিত হওয়া উচিত Fragment.onPause()

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.