আপনি সম্প্রতি একটি অ্যাপ্লিকেশনটির জন্য বর্ণনা করেছেন ঠিক একই আচরণটি আমাদের কার্যকর করতে হয়েছিল। অ্যাপ্লিকেশনটির পর্দা এবং সামগ্রিক প্রবাহ ইতিমধ্যে সংজ্ঞায়িত করা হয়েছে সুতরাং আমাদের এটির সাথে আটকে থাকতে হবে (এটি একটি আইওএস অ্যাপ্লিকেশন ক্লোন ...)। ভাগ্যক্রমে, আমরা অন-স্ক্রিনের ব্যাক বোতামগুলি থেকে মুক্তি পেতে পেরেছি :)
আমরা ট্যাবএকটিভিটি, ফ্রেগমেন্টএটিভিটিস (আমরা টুকরো টুকরো জন্য সমর্থন লাইব্রেরি ব্যবহার করছিলাম) এবং টুকরোগুলির মিশ্রণ ব্যবহার করে সমাধানটি হ্যাক করেছি ed পূর্ববর্তী ক্ষেত্রে, আমি দৃ sure়ভাবে নিশ্চিত যে এটি সর্বোত্তম আর্কিটেকচারের সিদ্ধান্ত ছিল না, তবে আমরা জিনিসটি কাজ করতে সক্ষম হয়েছি। যদি আমার এটি আবার করতে হয় তবে আমি সম্ভবত আরও বেশি কার্যকলাপ-ভিত্তিক সমাধান (কোনও টুকরো টুকরো না) করার চেষ্টা করতাম, বা ট্যাবগুলির জন্য একটি মাত্র ক্রিয়াকলাপ চেষ্টা করতাম এবং বাকী সমস্ত দৃশ্য হতে দেই (যা আমি খুঁজে পাই তার চেয়ে অনেক বেশি সামগ্রিক ক্রিয়াকলাপগুলির তুলনায় পুনরায় ব্যবহারযোগ্য)।
সুতরাং প্রয়োজনীয়তাগুলির প্রতিটি ট্যাবে কিছু ট্যাব এবং বাসা বাঁধার স্ক্রিন থাকা দরকার:
tab 1
screen 1 -> screen 2 -> screen 3
tab 2
screen 4
tab 3
screen 5 -> 6
ইত্যাদি ...
সুতরাং বলুন: ব্যবহারকারী ট্যাব 1 এ শুরু হয়, পর্দা 1 থেকে স্ক্রিন 2 এবং পরে স্ক্রিন 3 এ নেভিগেট করে, তারপরে তিনি ট্যাব 3 এ স্যুইচ করেন এবং স্ক্রিন 4 থেকে 6 এ নেভিগেট করেন; যদি ট্যাব 1 এ ফিরে যায়, তার আবার স্ক্রিন 3 দেখতে হবে এবং যদি সে পিছনে চাপ দেয় তবে তার পর্দা 2 এ ফিরে আসা উচিত; আবার ফিরে এসে তিনি স্ক্রিন 1 এ আছেন; ট্যাব 3 এ স্যুইচ করুন এবং তিনি আবার 6 স্ক্রিনে আছেন।
অ্যাপ্লিকেশনটির প্রধান ক্রিয়াকলাপটি মেইনট্যাবঅ্যাক্টিভিটি যা ট্যাবঅ্যাক্টিভিটি প্রসারিত করে। প্রতিটি ট্যাব একটি ক্রিয়াকলাপের সাথে যুক্ত, এক্টিভিটিআইএনটিব 1, 2 এবং 3 বলতে দিন এবং তারপরে প্রতিটি পর্দা একটি খণ্ড হবে:
MainTabActivity
ActivityInTab1
Fragment1 -> Fragment2 -> Fragment3
ActivityInTab2
Fragment4
ActivityInTab3
Fragment5 -> Fragment6
প্রতিটি ক্রিয়াকলাপটিএনটি একসাথে কেবলমাত্র একটি টুকরো ধারণ করে এবং অন্য একটির জন্য কীভাবে একটি টুকরো প্রতিস্থাপন করতে হয় তা (একভিটিগ্রুপ হিসাবে প্রায় একই)) দুর্দান্ত জিনিসটি হ'ল প্রতিটি ট্যাবটির জন্য এইভাবে পৃথক ব্যাক স্ট্যাকগুলি মন্টেন করা বেশ সহজ।
প্রতিটি অ্যাক্টিভিটিআইএনটিবির কার্যকারিতা ছিল এক রকম: এক টুকরো থেকে অন্য খণ্ডে কীভাবে নেভিগেট করতে হয় এবং পিছনের স্ট্যাক বজায় রাখতে হয় তা জানুন, তাই আমরা এটিকে বেস ক্লাসে রেখেছি। আসুন একে এ্যাকটিভিটি ইনট্যাব বলি:
abstract class ActivityInTab extends FragmentActivity { // FragmentActivity is just Activity for the support library.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_in_tab);
}
/**
* Navigates to a new fragment, which is added in the fragment container
* view.
*
* @param newFragment
*/
protected void navigateTo(Fragment newFragment) {
FragmentManager manager = getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.replace(R.id.content, newFragment);
// Add this transaction to the back stack, so when the user presses back,
// it rollbacks.
ft.addToBackStack(null);
ft.commit();
}
}
ক্রিয়াকলাপ_আইন_ট্যাব.এক্সএমএল কেবল এটি:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:isScrollContainer="true">
</RelativeLayout>
আপনি দেখতে পাচ্ছেন, প্রতিটি ট্যাবের জন্য ভিউ লেআউটটি একই ছিল। কারণ এটি প্রতিটি ফ্রেমকে ধারণ করে এমন একটি ফ্রেমলআউট content খণ্ডগুলি হ'ল প্রতিটি স্ক্রিনের দর্শন।
কেবল বোনাস পয়েন্টের জন্য, আমরা যখন ব্যবহারকারী পিছনে টিপায় এবং আর ফিরে যাওয়ার মতো আরও কিছু টুকরো না থাকে তখন আমরা একটি নিশ্চিত ডায়ালগ দেখানোর জন্য কিছুটা ছোট কোড যুক্ত করেছি:
// In ActivityInTab.java...
@Override
public void onBackPressed() {
FragmentManager manager = getSupportFragmentManager();
if (manager.getBackStackEntryCount() > 0) {
// If there are back-stack entries, leave the FragmentActivity
// implementation take care of them.
super.onBackPressed();
} else {
// Otherwise, ask user if he wants to leave :)
showExitDialog();
}
}
এটি বেশ সেটআপ। আপনি দেখতে পাচ্ছেন যে প্রতিটি ফ্রেগমেন্টএটিভিটি (বা কেবলমাত্র অ্যান্ড্রয়েড> 3 এ কার্যকলাপ) তার নিজস্ব ফ্রেগমেন্টম্যানেজারের সাথে সমস্ত ব্যাক-স্ট্যাকিংয়ের যত্ন নিচ্ছে।
ActivityInTab1 এর মতো ক্রিয়াকলাপটি সত্যিই সহজ হবে, এটি কেবল এটি প্রথম টুকরা (অর্থাত্ স্ক্রিন) দেখিয়ে দেবে:
public class ActivityInTab1 extends ActivityInTab {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
navigateTo(new Fragment1());
}
}
তারপরে, যদি কোনও খণ্ডকে অন্য খণ্ডে নেভিগেট করতে হয়, তবে এটির জন্য কিছুটা বাজে কাস্টিং করতে হবে ... তবে এটি খুব খারাপ নয়:
// In Fragment1.java for example...
// Need to navigate to Fragment2.
((ActivityIntab) getActivity()).navigateTo(new Fragment2());
সুতরাং এটি বেশ। আমি নিশ্চিত যে এটি খুব ক্যানোনিকাল নয় (এবং বেশিরভাগই নিশ্চিত খুব ভাল নয়) সমাধান নয়, তাই আমি পাকা অ্যান্ড্রয়েড বিকাশকারীদের জিজ্ঞাসা করতে চাই যে এই কার্যকারিতাটি অর্জনের জন্য আরও ভাল পদ্ধতির কী হতে পারে, এবং যদি এটি না হয় তবে "এটি কীভাবে এটি হয় না অ্যান্ড্রয়েডে "সম্পন্ন", আপনি যদি আমাকে এমন কোনও লিঙ্ক বা উপাদানের দিকে নির্দেশ করতে পারেন তবে আমি এটি প্রশংসা করতে পারি যে এটির কাছে যাওয়ার অ্যান্ড্রয়েড উপায় কোনটি (ট্যাবস, ট্যাবগুলিতে নেস্টেড স্ক্রীন ইত্যাদি) বোঝায় । মন্তব্যগুলিতে এই উত্তরটি ছিন্ন করতে নির্দ্বিধায় :)
এই সমাধানটি খুব ভাল নয় বলে একটি চিহ্ন হিসাবে সম্প্রতি আমাকে অ্যাপ্লিকেশনটিতে কিছু নেভিগেশন কার্যকারিতা যুক্ত করতে হয়েছিল। কিছু উদ্ভট বাটন যা ব্যবহারকারীদের এক ট্যাব থেকে অন্য ট্যাব এবং নেস্টেড স্ক্রিনে নিয়ে যায়। প্রোগ্রামটিমেটিকভাবে করাটা বাটের ব্যথা ছিল কারণ কারা-কারা সমস্যা এবং কখন টুকরো এবং ক্রিয়াকলাপগুলি আসলে তাত্ক্ষণিকভাবে এবং আরম্ভ হয় তা নিয়ে কাজ করে। আমার মনে হয় যদি সেই স্ক্রিনগুলি এবং ট্যাবগুলি সমস্ত সত্যই সত্যই প্রদর্শিত হয় it
শেষ অবধি, যদি আপনার ওরিয়েন্টেশন পরিবর্তনগুলি থেকে বাঁচতে হয় তবে আপনার টুকরোগুলি সেটআর্গমেন্টস / গেটআরগমেন্টস ব্যবহার করে তৈরি করা গুরুত্বপূর্ণ। আপনি যদি আপনার টুকরোগুলি নির্মাণকারীদের ক্ষেত্রে উদাহরণ ভেরিয়েবলগুলি সেট করেন তবে আপনার ক্ষতি হবে। তবে ভাগ্যক্রমে এটি ঠিক করা খুব সহজ: কেবল কনস্ট্রাক্টরের সেটআরগমেন্টসগুলিতে সমস্ত কিছু সংরক্ষণ করুন এবং তারপরে ব্যবহারের জন্য getArguments সহ সেই জিনিসগুলি পুনরুদ্ধার করুন।