رفتن به مطلب
  • 0

مشکل در tablayout


mahdi0020

سوال

سلام وقتتون بخیر.

من یه tablayout دارم که وقتی اجرا میشه همزمان دو تا فرگمنت رو اجرا میکنه چی کارش کنم تا فقط یه فرگمنت رو اجرا کنه ؟

tablayout با viewpager ساخته شده

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

4 پاسخ به این سوال تاکنون داده شده است

ارسال‌های توصیه شده

در 45 دقیقه قبل، mahdi0020 گفته است :

سلام وقتتون بخیر.

من یه tablayout دارم که وقتی اجرا میشه همزمان دو تا فرگمنت رو اجرا میکنه چی کارش کنم تا فقط یه فرگمنت رو اجرا کنه ؟

tablayout با viewpager ساخته شده

توصیه میشه از ViewStub استفاده کنید. اینجوری فقط فرگمنتی که توی صفحه ظاهر میشه لود میشه.

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

سلام.

طرز کارکردش چطوریه ؟ چطوری میشه ازش برای tablayout استفاده کرد ؟

 

ممنون...

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

به شکل زیر عمل کنید.

1- یه لیوت به نام fragment_viewstub اینجاد کنید با کدهای زیر.

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="match_parent">
    <ProgressBar
        android:id="@+id/inflateProgressbar"
        android:foregroundGravity="center"
        android:layout_gravity="center"
        android:indeterminate="true"
        android:layout_width="48dp"
        android:layout_height="48dp"/>
    <ViewStub
        android:id="@+id/fragmentViewStub"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>

2- کلاس BaseViewStubFragment رو به شکل زیر ایجاد کنید.

public abstract class BaseViewStubFragment extends Fragment {
    private Bundle mSavedInstanceState;
    private boolean mHasInflated = false;
    private ViewStub mViewStub;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_viewstub, container, false);
        mViewStub = (ViewStub) view.findViewById(R.id.fragmentViewStub);
        mViewStub.setLayoutResource(getViewStubLayoutResource());
        mSavedInstanceState = savedInstanceState;

        if (getUserVisibleHint() && !mHasInflated) {
            View inflatedView = mViewStub.inflate();
            onCreateViewAfterViewStubInflated(inflatedView, mSavedInstanceState);
            afterViewStubInflated(view);
        }

        return view;
    }

    protected abstract void onCreateViewAfterViewStubInflated(View inflatedView, Bundle savedInstanceState);

    /**
     * The layout ID associated with this ViewStub
     * @see ViewStub#setLayoutResource(int)
     * @return
     */
    @LayoutRes
    protected abstract int getViewStubLayoutResource();

    /**
     *
     * @param originalViewContainerWithViewStub
     */
    @CallSuper
    protected void afterViewStubInflated(View originalViewContainerWithViewStub) {
        mHasInflated = true;
        if (originalViewContainerWithViewStub != null) {
            View pb = originalViewContainerWithViewStub.findViewById(R.id.inflateProgressbar);
            pb.setVisibility(View.GONE);
        }
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        if (isVisibleToUser && mViewStub != null && !mHasInflated) {
            View inflatedView = mViewStub.inflate();
            onCreateViewAfterViewStubInflated(inflatedView, mSavedInstanceState);
            afterViewStubInflated(getView());
        }
    }
    
    // Thanks to Noa Drach, this will fix the orientation change problem
    @Override
    public void onDetach() {
        super.onDetach();
        mHasInflated = false;
    }
}

3- حالا هر جا خواستید فرگمنت خواستید ایجاد کنید کافیه اونو از BaseViewStubFragment مشتق کنید

public class BaseFragment extends BaseViewStubFragment  {
        private Context context;
        private View rootView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context=getActivity();
    }


    @Override
    protected void onCreateViewAfterViewStubInflated(View inflatedView, Bundle savedInstanceState) {
        if (rootView == null) {
            rootView = inflatedView;
        } else {
            ((ViewGroup) rootView.getParent()).removeView(rootView);
        }
    }

    @Override
    protected int getViewStubLayoutResource() {
        return R.layout.fragment1;
    }
  
}

 

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

در 21 ساعت قبل، محمدرضا شاهپیری گفته است :

به شکل زیر عمل کنید.

1- یه لیوت به نام fragment_viewstub اینجاد کنید با کدهای زیر.


<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:layout_width="match_parent"
             android:layout_height="match_parent">
    <ProgressBar
        android:id="@+id/inflateProgressbar"
        android:foregroundGravity="center"
        android:layout_gravity="center"
        android:indeterminate="true"
        android:layout_width="48dp"
        android:layout_height="48dp"/>
    <ViewStub
        android:id="@+id/fragmentViewStub"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>

2- کلاس BaseViewStubFragment رو به شکل زیر ایجاد کنید.


public abstract class BaseViewStubFragment extends Fragment {
    private Bundle mSavedInstanceState;
    private boolean mHasInflated = false;
    private ViewStub mViewStub;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_viewstub, container, false);
        mViewStub = (ViewStub) view.findViewById(R.id.fragmentViewStub);
        mViewStub.setLayoutResource(getViewStubLayoutResource());
        mSavedInstanceState = savedInstanceState;

        if (getUserVisibleHint() && !mHasInflated) {
            View inflatedView = mViewStub.inflate();
            onCreateViewAfterViewStubInflated(inflatedView, mSavedInstanceState);
            afterViewStubInflated(view);
        }

        return view;
    }

    protected abstract void onCreateViewAfterViewStubInflated(View inflatedView, Bundle savedInstanceState);

    /**
     * The layout ID associated with this ViewStub
     * @see ViewStub#setLayoutResource(int)
     * @return
     */
    @LayoutRes
    protected abstract int getViewStubLayoutResource();

    /**
     *
     * @param originalViewContainerWithViewStub
     */
    @CallSuper
    protected void afterViewStubInflated(View originalViewContainerWithViewStub) {
        mHasInflated = true;
        if (originalViewContainerWithViewStub != null) {
            View pb = originalViewContainerWithViewStub.findViewById(R.id.inflateProgressbar);
            pb.setVisibility(View.GONE);
        }
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);

        if (isVisibleToUser && mViewStub != null && !mHasInflated) {
            View inflatedView = mViewStub.inflate();
            onCreateViewAfterViewStubInflated(inflatedView, mSavedInstanceState);
            afterViewStubInflated(getView());
        }
    }
    
    // Thanks to Noa Drach, this will fix the orientation change problem
    @Override
    public void onDetach() {
        super.onDetach();
        mHasInflated = false;
    }
}

3- حالا هر جا خواستید فرگمنت خواستید ایجاد کنید کافیه اونو از BaseViewStubFragment مشتق کنید


public class BaseFragment extends BaseViewStubFragment  {
        private Context context;
        private View rootView;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        context=getActivity();
    }


    @Override
    protected void onCreateViewAfterViewStubInflated(View inflatedView, Bundle savedInstanceState) {
        if (rootView == null) {
            rootView = inflatedView;
        } else {
            ((ViewGroup) rootView.getParent()).removeView(rootView);
        }
    }

    @Override
    protected int getViewStubLayoutResource() {
        return R.layout.fragment1;
    }
  
}

 

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

وقتی از viewpager استفاده میکنم یه adapter میسازه اینجا باید چی کار کرد ؟

بعد چطوری بگم که این کلاس BaseViewStubFragment اجرا بشه ؟

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

بایگانی شده

این موضوع بایگانی و قفل شده و دیگر امکان ارسال پاسخ نیست.

  • کاربران آنلاین در این صفحه   0 کاربر

    • هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.
×
×
  • اضافه کردن...