android - fragment meaning in bengali




একটি নতুন অ্যান্ড্রয়েড Fragment তাত্ক্ষণিক জন্য সর্বোত্তম অনুশীলন (8)

আমি একটি অ্যাপ্লিকেশন একটি নতুন Fragment তাত্ক্ষণিক দুটি সাধারণ অভ্যাস দেখেছি:

Fragment newFragment = new MyFragment();

এবং

Fragment newFragment = MyFragment.newInstance();

দ্বিতীয় বিকল্পটি স্ট্যাটিক পদ্ধতি newInstance() এবং সাধারণত নিম্নলিখিত পদ্ধতি ধারণ করে।

public static Fragment newInstance() 
{
    MyFragment myFragment = new MyFragment();
    return myFragment;
}

প্রথমত, আমি ভেবেছিলাম যে মূল সুবিধাটি হ'ল ফ্র্যাগমেন্টের নতুন দৃষ্টান্ত তৈরি করার সময় আমি নমনীয়তা দেওয়ার জন্য নতুন ইনস্ট্যান্স () পদ্ধতিটি ওভারলোড করতে পারতাম - তবে আমি ফ্র্যাগমেন্টের জন্য ওভারলোড হওয়া কনস্ট্রাকটর তৈরি করেও এটি করতে পারি।

আমি কি কিছু রেখে গেলাম?

অন্য একটি পদ্ধতির উপকারিতা কি কি? নাকি এটা শুধু ভাল অভ্যাস?


@ ইওয়াইডল নতুন newInstance পদ্ধতিটি আরও ভাল newInstance একটি বাধ্যতামূলক কারণ দেয়:

যদি অ্যান্ড্রয়েড পরে আপনার ফ্র্যাগমেন্টটি পুনরায় তৈরি করার সিদ্ধান্ত নেয় তবে এটি আপনার ফ্যাগমেন্টের কোনও যুক্তিবিজ্ঞান কনস্ট্রাকটরকে কল করতে চলেছে। তাই কনস্ট্রাকটর ওভারলোডিং একটি সমাধান নয়।

এটি এখনও একটি কনস্ট্রাকটর ব্যবহার করা সম্ভব। এটি কেন দেখতে হয়, প্রথমে আমাদের এটি দেখতে হবে কেন উপরের কাজটি Android দ্বারা ব্যবহৃত হয়।

একটি ফাটল ব্যবহার করা যেতে পারে আগে, একটি উদাহরণ প্রয়োজন। অ্যান্ড্রয়েড আপনার YourFragment() কোনও আর্গুমেন্ট কন্সট্রাকটরকে কল করে, যা YourFragment() একটি উদাহরণ তৈরি করে। এখানে যে কোনও ওভারলোড করা কনস্ট্রাকটর যা আপনি লিখবেন তা উপেক্ষা করা হবে, যেমন Android কোনটি ব্যবহার করতে পারে তা জানা যায়নি।

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

setArguments() করার জন্য, Android আপনাকে একটি Bundle (কলিং setArguments() ) ব্যবহার করে তথ্য সংরক্ষণ করে বলে, যা আপনার YourFragment থেকে অ্যাক্সেস করা যেতে পারে। আর্গুমেন্ট bundle Android দ্বারা সুরক্ষিত, এবং অতএব স্থায়ী হতে নিশ্চিত করা হয়।

এই বান্ডেল সেট করার একটি উপায় একটি স্ট্যাটিক newInstance পদ্ধতি ব্যবহার করে হয়:

public static YourFragment newInstance (int data) {
    YourFragment yf = new YourFragment()
    /* See this code gets executed immediately on your object construction */
    Bundle args = new Bundle();
    args.putInt("data", data);
    yf.setArguments(args);
    return yf;
}

যাইহোক, একটি কনস্ট্রাক্টর:

public YourFragment(int data) {
    Bundle args = new Bundle();
    args.putInt("data", data);
    setArguments(args);
}

নতুন newInstance পদ্ধতি হিসাবে ঠিক একই জিনিস করতে পারেন।

স্বাভাবিকভাবেই, এটি ব্যর্থ হবে এবং অ্যান্ড্রয়েড আপনাকে নতুন newInstance পদ্ধতিটি ব্যবহার করতে চায় তার একটি কারণ:

public YourFragment(int data) {
    this.data = data; // Don't do this
}

আরো ব্যাখ্যা হিসাবে, এখানে অ্যান্ড্রয়েড এর ফ্র্যাগমেন্ট ক্লাস:

/**
 * Supply the construction arguments for this fragment.  This can only
 * be called before the fragment has been attached to its activity; that
 * is, you should call it immediately after constructing the fragment.  The
 * arguments supplied here will be retained across fragment destroy and
 * creation.
 */
public void setArguments(Bundle args) {
    if (mIndex >= 0) {
        throw new IllegalStateException("Fragment already active");
    }
    mArguments = args;
}

উল্লেখ্য, অ্যান্ড্রয়েড জিজ্ঞাসা করে যে আর্গুমেন্টগুলি শুধুমাত্র নির্মাণের সময় সেট করা হবে এবং এইগুলি বজায় রাখা হবে বলে নিশ্চয়তা দেয়।

সম্পাদনা করুন : @ জেএইচএইচ-এর মতামত উল্লেখ করে, আপনি যদি কোনও কাস্টম কনস্ট্রাক্টর সরবরাহ করেন যা কিছু আর্গুমেন্টের প্রয়োজন হয়, তবে জাভা কোনও ডিজি ডিফল্ট কনস্ট্রাক্টর সহ আপনার ফ্যাগমেন্ট সরবরাহ করবে না। সুতরাং এটি আপনাকে কোনও আর্গ কন্সট্রাকটর সংজ্ঞায়িত করতে হবে যা কোডটি যা আপনি নতুন newInstance কারখানা পদ্ধতিতে এড়িয়ে চলতে পারেন।

সম্পাদনা করুন : অ্যান্ড্রয়েডগুলি এখন টুকরাগুলির জন্য ওভারলোড হওয়া কনস্ট্রাকটর ব্যবহার করার অনুমতি দেয় না। আপনি newInstance পদ্ধতি ব্যবহার করতে হবে।


অ্যানড্রয়েডের সাথে আর্গুমেন্টগুলির সাথে টুকরো টুকরা করার সর্বোত্তম অনুশীলনটি আপনার ফাটলগুলিতে স্ট্যাটিক ফ্যাক্টরী পদ্ধতি রয়েছে।

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

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

আপনি এখানে আর্গুমেন্ট সঙ্গে টুকরা তাত্ক্ষণিক সর্বোত্তম অনুশীলন সম্পর্কে আরও তথ্য পেতে পারেন।


আমি এই জন্য একটি অনেক সিম্পল সমাধান আছে আমি বিশ্বাস করি।

public class MyFragment extends Fragment{

   private String mTitle;
   private List<MyObject> mObjects;

   public static MyFragment newInstance(String title, List<MyObject> objects)
   MyFragment myFrag = new MyFragment();
   myFrag.mTitle = title;
   myFrag.mObjects = objects;
   return myFrag;
   }

আরেকটি উপায় আছে:

Fragment.instantiate(context, MyFragment.class.getName(), myBundle)

নতুন newInstance() ব্যবহার করে newInstance() একমাত্র সুবিধা হল নিম্নরূপ:

  1. আপনার একটি একক স্থান থাকবে যেখানে টুকরা দ্বারা ব্যবহৃত সমস্ত আর্গুমেন্টগুলিকে একত্রিত করা যেতে পারে এবং আপনি প্রতিটি সময় নিচের কোডটি লিখতে হবে না।

    Bundle args = new Bundle();
    args.putInt("someInt", someInt);
    args.putString("someString", someString);
    // Put any other arguments
    myFragment.setArguments(args);
  2. অন্য ক্লাসগুলিকে বলার পক্ষে এটি একটি ভাল উপায় যা আর্গুমেন্টগুলি বিশ্বস্তভাবে কাজ করার প্রত্যাশা করে (যদিও আপনি কোনও আর্গুমেন্টকে বিভাজক দৃষ্টান্তের মধ্যে কোনও আর্গুমেন্টগুলি বান্ডলেড করা হয় তবে কেসগুলি পরিচালনা করতে সক্ষম হওয়া উচিত)।

সুতরাং, আমার গ্রহণ করা যে একটি newInstance() তাত্ক্ষণিক একটি স্ট্যাটিক newInstance() ব্যবহার করে একটি ভাল অভ্যাস।


ফ্র্যাগমেন্টটি তাত্ক্ষণিক করার সর্বোত্তম উপায়টি ডিফল্ট Fragment.instantiate পদ্ধতি ব্যবহার করে বা ফন্টটি তাত্ক্ষণিক করার জন্য কারখানা পদ্ধতি তৈরি করে।
সাবধান: ফ্র্যাগমেন্ট মেমরি পুনঃস্থাপন করার সময় সর্বদা অন্য অংশে একটি খালি কন্সট্রাকটর তৈরি করুন রান-টাইম ব্যতিক্রমটি নিক্ষেপ করবে।


সর্বোত্তম অনুশীলনের প্রশ্নগুলি থেকে, আমি যোগ করব যে, কিছু REST ওয়েব পরিষেবাদির সাথে কাজ করার সময় ফ্র্যাগমেন্ট তৈরির জন্য হাইব্রিড পদ্ধতির ব্যবহার করা খুব ভাল ধারণা।

আমরা ব্যবহারকারী অবজেক্ট প্রদর্শন করার জন্য জটিল বস্তু, উদাহরণস্বরূপ কিছু ব্যবহারকারী মডেল, পাস করতে পারবেন না

কিন্তু আমরা কি করতে পারি, সেই ব্যবহারকারীকে যাচাই করতে হয়! = নাল এবং যদি না হয় - তাহলে তাকে ডেটা স্তর থেকে আনুন, অন্যথায় - বিদ্যমান ব্যবহার করুন।

এইভাবে আমরা ব্যবহারকারীর দ্বারা ফ্রিজমেন্ট বিনোদন ক্ষেত্রে ব্যবহারকারীর ক্রিয়াকলাপ এবং ব্যবহারকারীর ক্রিয়াগুলির জন্য snappiness ক্ষেত্রে পাশাপাশি নিজেই বা শুধুমাত্র id এর ধারণ করে টুকরা তৈরি করার ক্ষমতা উভয় ক্ষমতা অর্জন করতে সক্ষম

কিছু ভালো লেগেছে:

public class UserFragment extends Fragment {
    public final static String USER_ID="user_id";
    private User user;
    private long userId;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        userId = getArguments().getLong(USER_ID);
        if(user==null){
            //
            // Recreating here user from user id(i.e requesting from your data model,
            // which could be services, direct request to rest, or data layer sitting
            // on application model
            //
             user = bringUser();
        }
    }

    public static UserFragment newInstance(User user, long user_id){
        UserFragment userFragment = new UserFragment();
        Bundle args = new Bundle();
        args.putLong(USER_ID,user_id);
        if(user!=null){
            userFragment.user=user;
        }
        userFragment.setArguments(args);
        return userFragment;

    }

    public static UserFragment newInstance(long user_id){
        return newInstance(null,user_id);
    }

    public static UserFragment newInstance(User user){
        return newInstance(user,user.id);
    }
}

setArguments() নিরর্থক। এটা শুধুমাত্র একটি জগাখিচুড়ি লাগে।

public class MyFragment extends Fragment {

    public String mTitle;
    public String mInitialTitle;

    public static MyFragment newInstance(String param1) {
        MyFragment f = new MyFragment();
        f.mInitialTitle = param1;
        f.mTitle = param1;
        return f;
    }

    @Override
    public void onSaveInstanceState(Bundle state) {
        state.putString("mInitialTitle", mInitialTitle);
        state.putString("mTitle", mTitle);
        super.onSaveInstanceState(state);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle state) {
        if (state != null) {
            mInitialTitle = state.getString("mInitialTitle");
            mTitle = state.getString("mTitle");
        } 
        ...
    }
}




android-fragments