কীভাবে স্ক্রিন ওরিয়েন্টেশন পরিবর্তনের মাধ্যমে কাস্টম ভিউগুলিকে রাষ্ট্র হারানো থেকে রোধ করা যায়


248

স্ক্রিন ওরিয়েন্টেশন পরিবর্তনগুলি জুড়ে কিছু গুরুত্বপূর্ণ উপাদান সংরক্ষণ এবং পুনরুদ্ধার করার onRetainNonConfigurationInstance()জন্য আমি সফলভাবে আমার প্রধানের জন্য প্রয়োগ করেছি Activity

তবে মনে হচ্ছে, ওরিয়েন্টেশন পরিবর্তনের সাথে সাথে আমার কাস্টম ভিউগুলি স্ক্র্যাচ থেকে পুনরায় তৈরি করা হচ্ছে। এটি উপলব্ধি করে, যদিও আমার ক্ষেত্রে এটি অসুবিধাজনক কারণ প্রশ্নে কাস্টম ভিউটি একটি এক্স / ওয়াই প্লট এবং প্লটযুক্ত পয়েন্টগুলি কাস্টম ভিউতে সংরক্ষণ করা হয়।

onRetainNonConfigurationInstance()কাস্টম ভিউয়ের অনুরূপ কিছু বাস্তবায়নের জন্য কি কোনও কৌতূহলপূর্ণ উপায় আছে , বা আমার কি কেবল কাস্টম ভিউতে এমন পদ্ধতিগুলি প্রয়োগ করতে হবে যা আমাকে তার "রাষ্ট্র" পেতে এবং সেট করার অনুমতি দেয়?

উত্তর:


415

আপনি প্রয়োগ করে এই কাজ করতে View#onSaveInstanceStateএবং View#onRestoreInstanceStateএবং ব্যাপ্ত View.BaseSavedStateবর্গ।

public class CustomView extends View {

  private int stateToSave;

  ...

  @Override
  public Parcelable onSaveInstanceState() {
    //begin boilerplate code that allows parent classes to save state
    Parcelable superState = super.onSaveInstanceState();

    SavedState ss = new SavedState(superState);
    //end

    ss.stateToSave = this.stateToSave;

    return ss;
  }

  @Override
  public void onRestoreInstanceState(Parcelable state) {
    //begin boilerplate code so parent classes can restore state
    if(!(state instanceof SavedState)) {
      super.onRestoreInstanceState(state);
      return;
    }

    SavedState ss = (SavedState)state;
    super.onRestoreInstanceState(ss.getSuperState());
    //end

    this.stateToSave = ss.stateToSave;
  }

  static class SavedState extends BaseSavedState {
    int stateToSave;

    SavedState(Parcelable superState) {
      super(superState);
    }

    private SavedState(Parcel in) {
      super(in);
      this.stateToSave = in.readInt();
    }

    @Override
    public void writeToParcel(Parcel out, int flags) {
      super.writeToParcel(out, flags);
      out.writeInt(this.stateToSave);
    }

    //required field that makes Parcelables from a Parcel
    public static final Parcelable.Creator<SavedState> CREATOR =
        new Parcelable.Creator<SavedState>() {
          public SavedState createFromParcel(Parcel in) {
            return new SavedState(in);
          }
          public SavedState[] newArray(int size) {
            return new SavedState[size];
          }
    };
  }
}

কাজটি ভিউ এবং ভিভের সেভস্টেট ক্লাসের মধ্যে বিভক্ত। Parcelআপনার SavedStateক্লাসে এবং পড়া থেকে লেখার সমস্ত কাজ করা উচিত । তারপরে আপনার ভিউ ক্লাসটি রাজ্য সদস্যদের আহরণের এবং শ্রেণিকে বৈধ অবস্থায় ফিরিয়ে আনতে প্রয়োজনীয় কাজটি করতে পারে।

নোটস: View#onSavedInstanceStateএবং View#onRestoreInstanceStateআপনার জন্য স্বয়ংক্রিয়ভাবে ডাকা হয় যদি View#getIdমান = = ০ দেয় তবে এটি ঘটে যখন আপনি এটি এক্সএমএলে কোনও আইডি দেন বা setIdম্যানুয়ালি কল করেন । অন্যথায় আপনাকে View#onSaveInstanceStateপার্সেলবেলকে কল করতে হবে এবং লিখতে হবে যে রাজ্যটি Activity#onSaveInstanceStateসংরক্ষণ করার জন্য আপনি যে পার্সেলটি পেয়েছেন সেগুলি ফেরত পাঠিয়েছেন এবং পরবর্তীতে এটি পড়ুন এবং এটি View#onRestoreInstanceStateথেকে পাস করুন Activity#onRestoreInstanceState

এর আর একটি সাধারণ উদাহরণ হ'ল CompoundButton


14
যারা এখানে পৌঁছেছেন তাদের জন্য কারণ v4 সমর্থন লাইব্রেরির সাথে টুকরোটি ব্যবহার করার সময় এটি কাজ করে না, আমি নোট করি যে সমর্থন লাইব্রেরিটি আপনার জন্য ভিভির অন সেভআইন্সট্যান্সস্টেট / অনরেস্টোরইনস্ট্যান্স স্টেটকে কল করবে না বলে মনে হচ্ছে; ফ্রেগমেন্টঅ্যাক্টিভিটি বা খণ্ডের কোনও সুবিধাজনক জায়গা থেকে আপনাকে এটিকে স্পষ্টভাবে কল করতে হবে।
চৌম্বকীয়

69
নোট করুন যে কাস্টমভিউটি আপনি এটি প্রয়োগ করেন তাতে একটি অনন্য আইডি সেট থাকা উচিত, অন্যথায় তারা একে অপরের সাথে রাষ্ট্র ভাগ করে নেবে। সেভডস্টেটটি কাস্টমভিউয়ের আইডির বিপরীতে সংরক্ষিত থাকে, সুতরাং আপনার যদি একই আইডির সাথে একাধিক কাস্টম ভিউ বা কোনও আইডি নেই, তবে চূড়ান্ত কাস্টমভিউ.অনসেভআইনস্ট্যান্সস্টেটে সংরক্ষিত পার্সেলটি কাস্টমভিউ.অনরেস্টোরইনস্ট্যান্সস্টেটে কল করা হবে () মতামত পুনরুদ্ধার করা হয়।
নিক স্ট্রিট

5
এই পদ্ধতিটি দুটি কাস্টম মতামত (একটির ক্ষেত্রে অন্য প্রসারিত করা) নিয়ে কাজ করে না। আমার দৃষ্টিভঙ্গি পুনরুদ্ধার করার সময় আমি ক্লাসনটফাউন্ডএক্সেপশন পেতে থাকি। আমাকে কোবার 42 এর উত্তরে বান্ডিল পদ্ধতির ব্যবহার করতে হয়েছিল।
ক্রিস ফিস্ট

3
onSaveInstanceState()এবং onRestoreInstanceState()হওয়া উচিত protected(তাদের সুপারক্লাসের মতো), না public। তাদের প্রকাশ করার কোনও কারণ নেই ...
X --pplI'-I0llwlg'I -

7
এই ভাল কাজ করে না যখন একটি কাস্টম সংরক্ষণ BaseSaveStateএকটি বর্গ যে RecyclerView প্রসারিত, আপনি পেতে Parcel﹕ Class not found when unmarshalling: android.support.v7.widget.RecyclerView$SavedState java.lang.ClassNotFoundException: android.support.v7.widget.RecyclerView$SavedStateযাতে আপনি বাগ ফিক্স যে এখানে নিচে লেখা করতে হবে: github.com/ksoichiro/Android-ObservableScrollView/commit/... (এর ClassLoader ব্যবহার সুপার
স্টেটটি

459

আমি মনে করি এটি অনেক সহজ সংস্করণ। Bundleএকটি বিল্ট-ইন টাইপ যা প্রয়োগ করেParcelable

public class CustomView extends View
{
  private int stuff; // stuff

  @Override
  public Parcelable onSaveInstanceState()
  {
    Bundle bundle = new Bundle();
    bundle.putParcelable("superState", super.onSaveInstanceState());
    bundle.putInt("stuff", this.stuff); // ... save stuff 
    return bundle;
  }

  @Override
  public void onRestoreInstanceState(Parcelable state)
  {
    if (state instanceof Bundle) // implicit null check
    {
      Bundle bundle = (Bundle) state;
      this.stuff = bundle.getInt("stuff"); // ... load stuff
      state = bundle.getParcelable("superState");
    }
    super.onRestoreInstanceState(state);
  }
}

5
কোনও বান্ডেল ফেরত দিলে কেন একটি বান্ডেল দিয়ে ডাকা হবে না ? onRestoreInstanceStateonSaveInstanceState
কিওয়ারটি

5
OnRestoreInstanceউত্তরাধিকারসূত্রে প্রাপ্ত। আমরা হেডারটি পরিবর্তন করতে পারি না। Parcelableএটি কেবল একটি ইন্টারফেস, Bundleএটির জন্য একটি বাস্তবায়ন।
Kobor42

5
ধন্যবাদ এই উপায়টি আরও ভাল এবং কাস্টম ভিউগুলির জন্য সেভডস্টেট কাঠামোটি ব্যবহার করার সময় বেডপ্যারসেসেবলএক্সসেপশন এড়িয়ে চলেছে কারণ সংরক্ষণকৃত অবস্থাটি আপনার কাস্টম সেভডস্টেটের জন্য শ্রেণি লোডারটিকে সঠিকভাবে সেট করতে অক্ষম বলে মনে হচ্ছে!
আয়ান ওয়ারউইক

3
একটি ক্রিয়াকলাপে আমার একই দৃষ্টিভঙ্গির বেশ কয়েকটি উদাহরণ রয়েছে। তাদের সকলের এক্সএমএলে অনন্য আইডি রয়েছে। তবে এখনও তারা সকলেই সর্বশেষ দর্শনের সেটিংস পান। কোন ধারনা?
ক্রিস্টোফার

15
এই সমাধানটি ঠিক থাকতে পারে তবে এটি অবশ্যই নিরাপদ নয়। এটি প্রয়োগ করে আপনি ধরে নিচ্ছেন যে বেস স্টেটটি Viewএকটি নয় Bundle। অবশ্যই, এই মুহূর্তে এটি সত্য, তবে আপনি এই বাস্তবায়ন বাস্তবতার উপর নির্ভর করছেন যা সত্য হওয়ার নিশ্চয়তা দেয় না।
দিমিত্রি জায়েতসেভ

18

এখানে আরও দুটি রূপ রয়েছে যা উপরের দুটি পদ্ধতির মিশ্রণ ব্যবহার করে। Parcelableএকটি এর সরলতার সাথে গতি এবং যথার্থতার সংমিশ্রণ Bundle:

@Override
public Parcelable onSaveInstanceState() {
    Bundle bundle = new Bundle();
    // The vars you want to save - in this instance a string and a boolean
    String someString = "something";
    boolean someBoolean = true;
    State state = new State(super.onSaveInstanceState(), someString, someBoolean);
    bundle.putParcelable(State.STATE, state);
    return bundle;
}

@Override
public void onRestoreInstanceState(Parcelable state) {
    if (state instanceof Bundle) {
        Bundle bundle = (Bundle) state;
        State customViewState = (State) bundle.getParcelable(State.STATE);
        // The vars you saved - do whatever you want with them
        String someString = customViewState.getText();
        boolean someBoolean = customViewState.isSomethingShowing());
        super.onRestoreInstanceState(customViewState.getSuperState());
        return;
    }
    // Stops a bug with the wrong state being passed to the super
    super.onRestoreInstanceState(BaseSavedState.EMPTY_STATE); 
}

protected static class State extends BaseSavedState {
    protected static final String STATE = "YourCustomView.STATE";

    private final String someText;
    private final boolean somethingShowing;

    public State(Parcelable superState, String someText, boolean somethingShowing) {
        super(superState);
        this.someText = someText;
        this.somethingShowing = somethingShowing;
    }

    public String getText(){
        return this.someText;
    }

    public boolean isSomethingShowing(){
        return this.somethingShowing;
    }
}

3
এটি কাজ করে না। আমি ক্লাসকাস্টএক্সেপশন পেয়েছি ... এবং এর কারণ এটির জন্য পাবলিক স্ট্যাটিক ক্রিয়েটার দরকার যাতে এটি আপনার Stateপার্সেল থেকে ইনস্ট্যান্ট করে। দয়া করে একবার দেখুন: Charlesharley.com/2012/pogramming/…
মাটো

8

এখানে উত্তরগুলি ইতিমধ্যে দুর্দান্ত, তবে কাস্টম ভিউগ্রুপগুলির জন্য অগত্যা কাজ করবেন না। সমস্ত কাস্টম ভিউগুলি তাদের স্থিতি ধরে রাখতে, আপনাকে অবশ্যই ওভাররাইড করতে হবে onSaveInstanceState()এবং onRestoreInstanceState(Parcelable state)প্রতিটি ক্লাসে। তারা এক্সএমএল থেকে স্ফীত হয়েছে বা প্রোগ্রামগতভাবে যুক্ত হয়েছে কিনা তাও আপনাকে নিশ্চিত করতে হবে যে সেগুলির সকলেরই অনন্য আইডি রয়েছে।

আমি যা নিয়ে এসেছি তা উল্লেখযোগ্যভাবে ছিল কোবার 42 এর উত্তরের মতো, তবে ত্রুটিটি রয়ে গেল কারণ আমি একটি কাস্টম ভিউগ্রুপে প্রোগ্রামিয়েটিকভাবে ভিউগুলি যুক্ত করেছিলাম এবং অনন্য আইডি নির্ধারণ করছিলাম না।

মাটো দ্বারা ভাগ করা লিঙ্কটি কাজ করবে, তবে এর অর্থ পৃথক পৃথক দর্শনগুলির কেউই তাদের নিজস্ব রাজ্য পরিচালনা করে না - পুরো রাজ্যটি ভিউগ্রুপ পদ্ধতিতে সংরক্ষণ করা হয়।

সমস্যাটি হ'ল যখন এই ভিউগ্রুপগুলির একাধিক একটি বিন্যাসে যুক্ত করা হয়, এক্সএমএল থেকে তাদের উপাদানগুলির আইডিগুলি আর অনন্য থাকে না (যদি এটি এক্সএমএলে সংজ্ঞায়িত থাকে)। রানটাইমের সময়, আপনি View.generateViewId()কোনও দৃশ্যের জন্য একটি অনন্য আইডি পাওয়ার জন্য স্থিতিশীল পদ্ধতিতে কল করতে পারেন । এটি কেবল এপিআই 17 থেকে উপলব্ধ।

ভিউগ্রুপ থেকে আমার কোডটি এখানে রয়েছে (এটি বিমূর্ত, এবং এমওগ্রিনালভ্যালু একটি প্রকারের পরিবর্তনশীল):

public abstract class DetailRow<E> extends LinearLayout {

    private static final String SUPER_INSTANCE_STATE = "saved_instance_state_parcelable";
    private static final String STATE_VIEW_IDS = "state_view_ids";
    private static final String STATE_ORIGINAL_VALUE = "state_original_value";

    private E mOriginalValue;
    private int[] mViewIds;

// ...

    @Override
    protected Parcelable onSaveInstanceState() {

        // Create a bundle to put super parcelable in
        Bundle bundle = new Bundle();
        bundle.putParcelable(SUPER_INSTANCE_STATE, super.onSaveInstanceState());
        // Use abstract method to put mOriginalValue in the bundle;
        putValueInTheBundle(mOriginalValue, bundle, STATE_ORIGINAL_VALUE);
        // Store mViewIds in the bundle - initialize if necessary.
        if (mViewIds == null) {
            // We need as many ids as child views
            mViewIds = new int[getChildCount()];
            for (int i = 0; i < mViewIds.length; i++) {
                // generate a unique id for each view
                mViewIds[i] = View.generateViewId();
                // assign the id to the view at the same index
                getChildAt(i).setId(mViewIds[i]);
            }
        }
        bundle.putIntArray(STATE_VIEW_IDS, mViewIds);
        // return the bundle
        return bundle;
    }

    @Override
    protected void onRestoreInstanceState(Parcelable state) {

        // We know state is a Bundle:
        Bundle bundle = (Bundle) state;
        // Get mViewIds out of the bundle
        mViewIds = bundle.getIntArray(STATE_VIEW_IDS);
        // For each id, assign to the view of same index
        if (mViewIds != null) {
            for (int i = 0; i < mViewIds.length; i++) {
                getChildAt(i).setId(mViewIds[i]);
            }
        }
        // Get mOriginalValue out of the bundle
        mOriginalValue = getValueBackOutOfTheBundle(bundle, STATE_ORIGINAL_VALUE);
        // get super parcelable back out of the bundle and pass it to
        // super.onRestoreInstanceState(Parcelable)
        state = bundle.getParcelable(SUPER_INSTANCE_STATE);
        super.onRestoreInstanceState(state);
    } 
}

কাস্টম আইডি আসলেই একটি সমস্যা, তবে আমি মনে করি এটি দৃশ্য সংরক্ষণের সময় পরিচালনা করা উচিত, রাষ্ট্রীয় সংরক্ষণে নয়।
Kobor42

ভাল যুক্তি. আপনি কি কনস্ট্রাক্টরে এমভিউইডস সেট করার পরামর্শ দিচ্ছেন এবং তারপরে রাষ্ট্রটি পুনরুদ্ধার করা হলে ওভাররাইট?
ফ্ল্যাচার জনস

2

আমার সমস্যা ছিল যে অনস্টোরইনস্ট্যান্স স্টেট আমার সমস্ত কাস্টম মতামত সর্বশেষ দর্শনের স্থিতির সাথে পুনরুদ্ধার করেছিল। আমি আমার কাস্টম ভিউতে এই দুটি পদ্ধতি যুক্ত করে এটি সমাধান করেছি:

@Override
protected void dispatchSaveInstanceState(SparseArray<Parcelable> container) {
    dispatchFreezeSelfOnly(container);
}

@Override
protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container) {
    dispatchThawSelfOnly(container);
}

কেবলমাত্র প্রেরণফ্রিজেস্ফেল্ফ এবং কেবলমাত্র ডিসপ্যাচউসসেল্ফ শুধুমাত্র পদ্ধতিগুলি ভিউ নয়, ভিউগ্রুপের অন্তর্গত। সুতরাং ক্ষেত্রে, আপনার কাস্টম ভিউটি বিল্ট-ইন ভিউ থেকে বাড়ানো হয়েছে। আপনার সমাধান প্রযোজ্য নয়।
হাউ লু

1

ব্যবহার করার পরিবর্তে onSaveInstanceStateএবং onRestoreInstanceState, আপনি এও ব্যবহার করতে পারেন ViewModel। আপনার ডেটা মডেলটি প্রসারিত করুন ViewModelএবং তারপরে আপনি ViewModelProvidersযখনই কার্যকলাপটি পুনঃনির্মাণ করেছেন প্রতিবার আপনার মডেলের একই উদাহরণটি পেতে ব্যবহার করতে পারেন :

class MyData extends ViewModel {
    // have all your properties with getters and setters here
}

public class MyActivity extends FragmentActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // the first time, ViewModelProvider will create a new MyData
        // object. When the Activity is recreated (e.g. because the screen
        // is rotated), ViewModelProvider will give you the initial MyData
        // object back, without creating a new one, so all your property
        // values are retained from the previous view.
        myData = ViewModelProviders.of(this).get(MyData.class);

        ...
    }
}

ব্যবহার করতে ViewModelProviders, যোগ করার জন্য নিম্নলিখিত dependenciesমধ্যে app/build.gradle:

implementation "android.arch.lifecycle:extensions:1.1.1"
implementation "android.arch.lifecycle:viewmodel:1.1.1"

উল্লেখ্য আপনার যে MyActivityপ্রসারিত FragmentActivityপরিবর্তে মাত্র ব্যাপ্ত Activity

আপনি এখানে ভিউমোডেলগুলি সম্পর্কে আরও পড়তে পারেন:



1
@ জেজেডি আমি আপনার পোস্ট করা নিবন্ধের সাথে একমত, এখনও সেভ করতে হবে এবং সঠিকভাবে পুনরুদ্ধার করতে হবে। ViewModelবিশেষত কার্যকর যদি আপনার কোনও রাজ্যের পরিবর্তনের সময় কোনও স্ক্রিন রোটেশনের সময় ধরে রাখতে বড় ডেটা সেট থাকে। আমি ViewModelএটি লেখার পরিবর্তে এটি ব্যবহার করা পছন্দ করি Applicationকারণ এটি স্পষ্টভাবে স্কুপ করা হয়েছে এবং একই অ্যাপ্লিকেশনটির একাধিক ক্রিয়াকলাপ সঠিকভাবে আচরণ করতে পারে।
বেনিডিক্ট ক্যাপেল

1

আমি দেখেছি যে এই উত্তর অ্যান্ড্রয়েড সংস্করণ 9 ও 10 আমি মনে করি এটি একটি ভাল পদ্ধতির হচ্ছে সে বিষয়ে কিছু ক্র্যাশ গচ্চা গেল কিন্তু যখন আমি কিছু খুঁজছেন ছিল অ্যান্ড্রয়েড কোড আমি বুঝতে পারলাম এটা একটা কন্সট্রাকটর অনুপস্থিত ছিল। উত্তরটি বেশ পুরানো তাই সেই সময় সম্ভবত এটির কোনও প্রয়োজন ছিল না। আমি যখন নিখোঁজ কনস্ট্রাক্টর যুক্ত করেছি এবং এটি নির্মাতার কাছ থেকে কল করি তখন ক্রাশটি ঠিক হয়ে যায়।

সুতরাং এখানে সম্পাদিত কোড:

public class CustomView extends View {

    private int stateToSave;

    ...

    @Override
    public Parcelable onSaveInstanceState() {
        Parcelable superState = super.onSaveInstanceState();
        SavedState ss = new SavedState(superState);

        // your custom state
        ss.stateToSave = this.stateToSave;

        return ss;
    }

    @Override
    protected void dispatchSaveInstanceState(SparseArray<Parcelable> container)
    {
        dispatchFreezeSelfOnly(container);
    }

    @Override
    public void onRestoreInstanceState(Parcelable state) {
        SavedState ss = (SavedState) state;
        super.onRestoreInstanceState(ss.getSuperState());

        // your custom state
        this.stateToSave = ss.stateToSave;
    }

    @Override
    protected void dispatchRestoreInstanceState(SparseArray<Parcelable> container)
    {
        dispatchThawSelfOnly(container);
    }

    static class SavedState extends BaseSavedState {
        int stateToSave;

        SavedState(Parcelable superState) {
            super(superState);
        }

        private SavedState(Parcel in) {
            super(in);
            this.stateToSave = in.readInt();
        }

        // This was the missing constructor
        @RequiresApi(Build.VERSION_CODES.N)
        SavedState(Parcel in, ClassLoader loader)
        {
            super(in, loader);
            this.stateToSave = in.readInt();
        }

        @Override
        public void writeToParcel(Parcel out, int flags) {
            super.writeToParcel(out, flags);
            out.writeInt(this.stateToSave);
        }    

        public static final Creator<SavedState> CREATOR =
            new ClassLoaderCreator<SavedState>() {

            // This was also missing
            @Override
            public SavedState createFromParcel(Parcel in, ClassLoader loader)
            {
                return Build.VERSION.SDK_INT >= Build.VERSION_CODES.N ? new SavedState(in, loader) : new SavedState(in);
            }

            @Override
            public SavedState createFromParcel(Parcel in) {
                return new SavedState(in, null);
            }

            @Override
            public SavedState[] newArray(int size) {
                return new SavedState[size];
            }
        };
    }
}

0

অন্যান্য উত্তরগুলি বাড়িয়ে তুলতে - যদি আপনার একই আইডির সাথে একাধিক কাস্টম যৌগিক দৃষ্টিভঙ্গি থাকে এবং সেগুলি একটি কনফিগারেশন পরিবর্তনে শেষ দৃশ্যের সাথে সমস্ত পুনরুদ্ধার করা হয়, কেবল আপনাকে কেবল সেভ / পুনরুদ্ধার ইভেন্টগুলি প্রেরণের জন্য ভিউটি বলতে হবে কয়েকটি পদ্ধতির ওভাররাইড করে নিজের কাছে।

class MyCompoundView : ViewGroup {

    ...

    override fun dispatchSaveInstanceState(container: SparseArray<Parcelable>) {
        dispatchFreezeSelfOnly(container)
    }

    override fun dispatchRestoreInstanceState(container: SparseArray<Parcelable>) {
        dispatchThawSelfOnly(container)
    }
}

কী ঘটছে এবং কেন এটি কাজ করে তার ব্যাখ্যার জন্য এই ব্লগ পোস্টটি দেখুন । মূলত আপনার যৌগিক দৃশ্যের শিশুদের ভিউ আইডিগুলি প্রতিটি যৌগিক দর্শন দ্বারা ভাগ করা হয় এবং রাষ্ট্র পুনরুদ্ধার গুলিয়ে যায় conf কেবলমাত্র যৌগিক দর্শনের জন্য রাষ্ট্র প্রেরণের মাধ্যমে আমরা তাদের বাচ্চাদের অন্যান্য যৌগিক দর্শন থেকে মিশ্র বার্তা পেতে বাধা দিই।

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