ওরিয়েন্টেশন পরিবর্তনে ফ্রেগমেন্ট হ্যান্ডেল করার মূর্খ-প্রমাণ উপায়


87
public class MainActivity extends Activity implements MainMenuFragment.OnMainMenuItemSelectedListener {

 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager
            .beginTransaction();

    // add menu fragment
    MainMenuFragment myFragment = new MainMenuFragment();
    fragmentTransaction.add(R.id.menu_fragment, myFragment);

    //add content
    DetailPart1 content1= new DetailPart1 ();
    fragmentTransaction.add(R.id.content_fragment, content1);
    fragmentTransaction.commit();

}
public void onMainMenuSelected(String tag) {
  //next menu is selected replace existing fragment
}

আমার পাশাপাশি দুটি তালিকার ভিউ পাশাপাশি রাখতে হবে, বামে মেনু এবং ডান পাশে এর সামগ্রী। ডিফল্টরূপে, প্রথম মেনুটি নির্বাচন করা হয় এবং এর সামগ্রীটি ডানদিকে প্রদর্শিত হয়। যে খণ্ডটি সামগ্রী প্রদর্শন করে তা নীচে রয়েছে:

public class DetailPart1 extends Fragment {
  ArrayList<HashMap<String, String>> myList = new ArrayList<HashMap<String, String>>();
  ListAdapter adap;
  ListView listview;

  @Override
  public void onActivityCreated(Bundle savedInstanceState) {
      super.onActivityCreated(savedInstanceState);

       if(savedInstanceState!=null){
        myList = (ArrayList)savedInstanceState.getSerializable("MYLIST_obj");
        adap = new LoadImageFromArrayListAdapter(getActivity(),myList );
        listview.setAdapter(adap);
       }else{
        //get list and load in list view
        getlistTask = new GetALLListTasks().execute();
    }


     @Override
   public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View v = inflater.inflate(R.layout.skyview_fragment, container,false);
           return v;
        }


     @Override
      public void onSaveInstanceState(Bundle outState) {
         super.onSaveInstanceState(outState);
          outState.putSerializable("MYLIST_obj", myList );
        }
    }

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


সাধারণত টুকরো ওরিয়েন্টেশন পরিবর্তনগুলি আপনাকে কিছু করার প্রয়োজন ছাড়াই যত্ন নেওয়া হয়। সুতরাং, আপনি যখন অরিয়েন্টেশন পরিবর্তন করবেন তখন আপনি কী সমস্যায় পড়েছেন?
আলেকজান্ডার কুল্যাখতিন

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

উত্তর:


132

আপনি onCreate();যখন নিজের ক্রিয়াকলাপে স্ক্রিনটি ঘুরিয়েছেন তখনই আপনি একটি নতুন খণ্ড তৈরি করছেন তবে আপনি পুরানোগুলিও বজায় রাখছেন super.onCreate(savedInstanceState);। সুতরাং সম্ভবত ট্যাগ সেট করুন এবং টুকরোটি বিদ্যমান থাকলে এটি সন্ধান করুন বা নাল বান্ডিলটি সুপারকে দিন।

এটি শিখতে আমাকে কিছুটা সময় নিয়েছে এবং আপনি যখন ভিউপিজারের মতো স্টাফ নিয়ে কাজ করছেন তখন এটি সত্যই দ্বি **** হতে পারে।

এই সঠিক বিষয়টি আচ্ছাদিত হওয়ায় আমি আপনাকে অতিরিক্ত সময় টুকরো সম্পর্কে পড়ার পরামর্শ দিচ্ছি ।

নিয়মিত ওরিয়েন্টেশন পরিবর্তনের উপর খণ্ডগুলি কীভাবে পরিচালনা করতে হবে তার একটি উদাহরণ এখানে রয়েছে:

ক্রিয়াকলাপ :

public class MainActivity extends FragmentActivity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            TestFragment test = new TestFragment();
            test.setArguments(getIntent().getExtras());
            getSupportFragmentManager().beginTransaction().replace(android.R.id.content, test, "your_fragment_tag").commit();
        } else {
            TestFragment test = (TestFragment) getSupportFragmentManager().findFragmentByTag("your_fragment_tag");
        }
    }
}

খণ্ড :

public class TestFragment extends Fragment {

    public static final String KEY_ITEM = "unique_key";
    public static final String KEY_INDEX = "index_key";
    private String mTime;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_layout, container, false);

        if (savedInstanceState != null) {
            // Restore last state
            mTime = savedInstanceState.getString("time_key");
        } else {
            mTime = "" + Calendar.getInstance().getTimeInMillis();
        }

        TextView title = (TextView) view.findViewById(R.id.fragment_test);
        title.setText(mTime);

        return view;
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("time_key", mTime);
    }
}

আপনার প্রয়াসের জন্য ওয়ারপজিটকে ধন্যবাদ, তবে আপনি আপনার পয়েন্ট সম্পর্কে কোডে ব্যাখ্যা দিলে আমি আনন্দিত হব। খণ্ডটি পুনরায় লোড না করে ওরিয়েন্টেশন পরিবর্তন পরিচালনা করার জন্য আমার কোডকে কীভাবে পরিবর্তন করতে হবে।
ব্যবহারকারী 1811741

4
অতএব, অরিয়েন্টেশনে পরিবর্তন করার জন্য আমার খণ্ডটির বিন্যাসের প্রয়োজন, তবে আমি যা করেছি তা সমস্ত রেকর্ডগুলি পুনরায় লোড করতে চাই না and এবং ওরিয়েন্টেশনের উপর নির্ভর করে তালিকাগুলি বা গ্রিডভিউ লুকান / দেখান hisএটি সঠিক উপায়?
ব্যবহারকারী 1811741

@ ইউজার 1811741 উদাহরণ সহ আপডেট হয়েছে। আমি আশা করি এটি সবকিছু পরিষ্কার করে দিয়েছে।
ওয়ারপজিট

@ ওয়ারপজিট ভিউপ্যাজারের খণ্ডন বাস্তবায়নের ক্ষেত্রে কীভাবে একই পরিস্থিতি পরিচালনা করতে পারে যেহেতু ভিউপ্যাজার সমস্ত প্রদর্শিত খণ্ডের যত্ন নেয় .. কোনও পরামর্শ নেই।
CoDe

4
@ শুভ ভাল আমি বিশ্বাস করি ভিউপ্যাজারটি এটি সঠিকভাবে পরিচালনা করে, যদি না হয় তবে আপনার প্রয়োজন অনুসারে আপনাকে গেট আইটেম বাস্তবায়ন ওভাররাইড করতে হবে। আশা করি যে আপনাকে সঠিক দিক নির্দেশ করেছে, যদি কোনও সঠিক প্রশ্ন না
রাখে

21

ওরিয়েন্টেশন পরিবর্তন এবং কার্যকলাপের বিনোদনের মধ্যে ডেটা কীভাবে বজায় রাখা যায় সে সম্পর্কে একটি ভাল গাইডলাইন অ্যান্ড্রয়েড নির্দেশিকাগুলিতে পাওয়া যাবে ।

সারসংক্ষেপ:

  1. আপনার টুকরো টিকিয়ে রাখতে সক্ষম করুন:

    setRetainInstance(true);
    
  2. শুধুমাত্র প্রয়োজনে একটি নতুন টুকরো তৈরি করুন (বা কমপক্ষে এটি থেকে ডেটা নেবেন)

    dataFragment = (DataFragment) fm.findFragmentByTag("data");
    
    // create the fragment and data the first time
    if (dataFragment == null) {
    

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