AppBar-এর সাথে কাজ করা

শীর্ষ অ্যাপ বার আপনার অ্যাপ উইন্ডোর শীর্ষে একটি সামঞ্জস্যপূর্ণ জায়গা প্রদান করে বর্তমান স্ক্রিন থেকে তথ্য এবং অ্যাকশন প্রদর্শন করার জন্য।

স্ক্রিনের উপরের দিকে থাকা অ্যাপ বারের উদাহরণ
ছবি ১. সবচেয়ে উপরে থাকা অ্যাপ বারের উদাহরণ।

অ্যাপের প্রয়োজনীয়তার উপর নির্ভর করে অ্যাপ বারের মালিকানা পরিবর্তিত হয়। ফ্র্যাগমেন্ট ব্যবহার করার সময়, অ্যাপ বারকে হোস্ট অ্যাক্টিভিটির মালিকানাধীন ActionBar বা আপনার ফ্র্যাগমেন্টের লেআউটের মধ্যে টুলবার হিসেবে প্রয়োগ করা যেতে পারে।

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

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

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

এই বিষয়ের উদাহরণে এমন একটি ExampleFragment-এর উল্লেখ করা হয়েছে যাতে এডিট করা যায় এমন প্রোফাইল আছে। ফ্র্যাগমেন্টটি তার অ্যাপ বারে নিম্নলিখিত XML-সংজ্ঞায়িত মেনু ইনফ্লেট করে:

<!-- sample_menu.xml -->
<menu
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/action_settings"
        android:icon="@drawable/ic_settings"
        android:title="@string/settings"
        app:showAsAction="ifRoom"/>
    <item
        android:id="@+id/action_done"
        android:icon="@drawable/ic_done"
        android:title="@string/done"
        app:showAsAction="ifRoom|withText"/>

</menu>

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

অ্যাক্টিভিটি-মালিকানাধীন অ্যাপ বার

অ্যাপ বার সাধারণত হোস্ট অ্যাক্টিভিটির মালিকানাধীন হয়। অ্যাপ বার কোনও অ্যাক্টিভিটির মালিকানাধীন হলে, ফ্র্যাগমেন্ট তৈরির সময় কল করা ফ্রেমওয়ার্ক পদ্ধতি ওভাররাইড করে ফ্র্যাগমেন্ট অ্যাপ বারের সাথে ইন্টার‍্যাক্ট করতে পারে।

অ্যাক্টিভিটির সাথে রেজিস্টার করুন

আপনার অ্যাপ বার ফ্র্যাগমেন্ট যে বিকল্প মেনুর পপুলেশনে অংশগ্রহণ করছে তা আপনাকে সিস্টেমকে জানাতে হবে। এটি করতে, আপনার ফ্র্যাগমেন্টের onCreate(Bundle) পদ্ধতিতে setHasOptionsMenu(true) কল করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

class ExampleFragment : Fragment() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setHasOptionsMenu(true)
    }
}

জাভা

public class ExampleFragment extends Fragment {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
    }
}

setHasOptionsMenu(true) সিস্টেমকে জানায় যে আপনার ফ্র্যাগমেন্ট মেনু-সম্পর্কিত কলব্যাক পেতে চায়। মেনু-সম্পর্কিত কোনও ইভেন্ট ঘটলে, যেমন ক্লিক, ইভেন্ট-হ্যান্ডলিং পদ্ধতিটি ফ্র্যাগমেন্টে কল করার আগে অ্যাক্টিভিটিতে কল করা হয়।

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

মেনু বড় করুন

অ্যাপ বারের বিকল্প মেনুতে আপনার মেনু মার্জ করতে, আপনার ফ্র্যাগমেন্টে onCreateOptionsMenu() ওভাররাইড করুন। এই পদ্ধতি বর্তমান অ্যাপ বার মেনু এবং একটি MenuInflater প্যারামিটার হিসেবে গ্রহণ করে। আপনার ফ্র্যাগমেন্টের মেনুর ইনস্ট্যান্স তৈরি করতে মেনু ইনফ্লেটার ব্যবহার করুন এবং তারপরে এটি বর্তমান মেনুতে মার্জ করুন, যেমন নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

class ExampleFragment : Fragment() {
    ...
    override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
        inflater.inflate(R.menu.sample_menu, menu)
    }
}

জাভা

public class ExampleFragment extends Fragment {
    ...
    @Override
    public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) {
       inflater.inflate(R.menu.sample_menu, menu);
    }
}

ছবি ২-এ আপডেট করা মেনু দেখানো হয়েছে।

বিকল্পের মেনুতে এখন আপনার মেনু ফ্র্যাগমেন্ট রয়েছে
ছবি ২. বিকল্পের মেনুতে এখন আপনার মেনু ফ্র্যাগমেন্ট রয়েছে।

ক্লিক ইভেন্ট ম্যানেজ করা

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

আপনার onOptionsItemSelected()-এর প্রয়োগে, মেনু আইটেমের itemId-এ switch স্টেটমেন্ট ব্যবহার করুন। বেছে নেওয়া আইটেমটি আপনার হলে, টাচ ইভেন্টটি যথাযথভাবে ম্যানেজ করুন এবং ক্লিক ইভেন্টটি ম্যানেজ করা হয়েছে তা জানাতে true রিটার্ন করুন। বেছে নেওয়া আইটেমটি আপনার না হলে, super ইমপ্লিমেন্টেশনকে কল করুন। ডিফল্ট হিসেবে, super ইমপ্লিমেন্টেশন false রিটার্ন করে যাতে মেনু প্রসেসিং চালিয়ে যাওয়া যায়।

Kotlin

class ExampleFragment : Fragment() {
    ...
    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
            R.id.action_settings -> {
                // Navigate to settings screen.
                true
            }
            R.id.action_done -> {
                // Save profile changes.
                true
            }
            else -> super.onOptionsItemSelected(item)
        }
    }
}

জাভা

public class ExampleFragment extends Fragment {
    ...
    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.action_settings:  {
                // Navigate to settings screen.
                return true;
            }
            case R.id.action_done: {
                // Save profile changes.
                return true;
            }
            default:
                return super.onOptionsItemSelected(item);
        }

    }

}

প্রয়োজনমতো মেনু পরিবর্তন করা

onPrepareOptionsMenu()-এ কোনও বোতাম লুকানো বা দেখানোর জন্য অথবা আইকন পরিবর্তন করার জন্য লজিক যোগ করুন। মেনু দেখানোর ঠিক আগে এই পদ্ধতি ব্যবহার করা হয়।

আগের উদাহরণটি নিয়ে আলোচনা করা যাক, ব্যবহারকারী এডিট করা শুরু না করা পর্যন্ত সেভ করুন বোতামটি অদৃশ্য থাকা উচিত এবং ব্যবহারকারী সেভ করার পরে এটি অদৃশ্য হয়ে যাওয়া উচিত। onPrepareOptionsMenu()-এ এই লজিক যোগ করলে মেনু সঠিকভাবে দেখানো হয়:

Kotlin

class ExampleFragment : Fragment() {
    ...
    override fun onPrepareOptionsMenu(menu: Menu){
        super.onPrepareOptionsMenu(menu)
        val item = menu.findItem(R.id.action_done)
        item.isVisible = isEditing
    }
}

জাভা

public class ExampleFragment extends Fragment {
    ...
    @Override
    public void onPrepareOptionsMenu(@NonNull Menu menu) {
        super.onPrepareOptionsMenu(menu);
        MenuItem item = menu.findItem(R.id.action_done);
        item.setVisible(isEditing);
    }
}

আপনাকে যখন মেনু আপডেট করতে হবে, যেমন কোনও ব্যবহারকারী প্রোফাইল তথ্য এডিট করার জন্য এডিট করুন বোতাম প্রেস করলে, হোস্ট অ্যাক্টিভিটিতে invalidateOptionsMenu() কল করুন যাতে সিস্টেম onCreateOptionsMenu() কল করার অনুরোধ করতে পারে। বাতিল করার পরে, আপনি onCreateOptionsMenu()-এ আপডেট করতে পারবেন। মেনু ইনফ্লেট হয়ে গেলে, সিস্টেম onPrepareOptionsMenu() কল করে এবং ফ্র্যাগমেন্টের বর্তমান অবস্থা দেখানোর জন্য মেনু আপডেট করে।

Kotlin

class ExampleFragment : Fragment() {
    ...
    fun updateOptionsMenu() {
        isEditing = !isEditing
        requireActivity().invalidateOptionsMenu()
    }
}

জাভা

public class ExampleFragment extends Fragment {
    ...
    public void updateOptionsMenu() {
        isEditing = !isEditing;
        requireActivity().invalidateOptionsMenu();
    }
}

ফ্র্যাগমেন্ট-মালিকানাধীন অ্যাপ বার

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

<androidx.appcompat.widget.Toolbar
    android:id="@+id/myToolbar"
    ... />

ফ্র্যাগমেন্ট-মালিকানাধীন অ্যাপ বার ব্যবহার করার সময়, Google সরাসরি Toolbar API ব্যবহার করার সাজেশন দেয়। setSupportActionBar() এবং Fragment মেনু API ব্যবহার করবেন না, যা শুধুমাত্র অ্যাক্টিভিটি-মালিকানাধীন অ্যাপ বারের জন্য উপযুক্ত।

মেনু বড় করুন

Toolbar কনভেনিয়েন্স পদ্ধতি inflateMenu(int) প্যারামিটার হিসেবে মেনু রিসোর্সের আইডি নেয়। আপনার টুলবারে XML মেনু রিসোর্স ইনফ্লেট করতে, এই পদ্ধতিতে resId পাস করুন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

class ExampleFragment : Fragment() {
    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        ...
        viewBinding.myToolbar.inflateMenu(R.menu.sample_menu)
    }
}

জাভা

public class ExampleFragment extends Fragment {
    ...
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        ...
        viewBinding.myToolbar.inflateMenu(R.menu.sample_menu);
    }

}

অন্য XML মেনু রিসোর্স ইনফ্লেট করতে, নতুন মেনুর resId সহ মেথডটি আবার কল করুন। নতুন মেনু আইটেম মেনুতে যোগ করা হয় এবং আগে থেকে থাকা মেনু আইটেম পরিবর্তন বা সরানো হয় না।

আপনি যদি আগে থেকে থাকা মেনু সেট পরিবর্তন করতে চান, তাহলে নতুন মেনু আইডি সহ inflateMenu(int) কল করার আগে মেনু মুছে দিন, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

class ExampleFragment : Fragment() {
    ...
    fun clearToolbarMenu() {
        viewBinding.myToolbar.menu.clear()
    }
}

জাভা

public class ExampleFragment extends Fragment {
    ...
    public void clearToolbarMenu() {

        viewBinding.myToolbar.getMenu().clear()

    }

}

ক্লিক ইভেন্ট ম্যানেজ করা

আপনি setOnMenuItemClickListener() পদ্ধতি ব্যবহার করে সরাসরি টুলবারে OnMenuItemClickListener পাস করতে পারবেন। ব্যবহারকারী টুলবারের শেষে বা সংশ্লিষ্ট ওভারফ্লোতে দেখানো অ্যাকশন বোতাম থেকে কোনও মেনু আইটেম বেছে নিলে এই লিসেনারকে ডাকা হয়। বেছে নেওয়া MenuItem লিসনারের onMenuItemClick() মেথডে পাস করা হয় এবং অ্যাকশন কনজিউম করার জন্য ব্যবহার করা যেতে পারে, যেমন নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

class ExampleFragment : Fragment() {
    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        ...
        viewBinding.myToolbar.setOnMenuItemClickListener {
            when (it.itemId) {
                R.id.action_settings -> {
                    // Navigate to settings screen.
                    true
                }
                R.id.action_done -> {
                    // Save profile changes.
                    true
                }
                else -> false
            }
        }
    }
}

জাভা

public class ExampleFragment extends Fragment {
    ...
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        ...
        viewBinding.myToolbar.setOnMenuItemClickListener(item -> {
            switch (item.getItemId()) {
                case R.id.action_settings:
                    // Navigate to settings screen.
                    return true;
                case R.id.action_done:
                    // Save profile changes.
                    return true;
                default:
                    return false;
            }
        });
    }
}

প্রয়োজনমতো মেনু পরিবর্তন করা

আপনার ফ্র্যাগমেন্ট অ্যাপ বারের মালিক হলে, আপনি রানটাইমে Toolbar অন্য যেকোনও ভিউয়ের মতো হুবহু পরিবর্তন করতে পারবেন।

আগের উদাহরণটি নিয়ে আলোচনা করা যাক, ব্যবহারকারী এডিট করা শুরু না করা পর্যন্ত সেভ করুন মেনু বিকল্পটি অদৃশ্য থাকা উচিত এবং ট্যাপ করার পরে এটি আবার অদৃশ্য হয়ে যাওয়া উচিত:

Kotlin

class ExampleFragment : Fragment() {
    ...
    fun updateToolbar() {
        isEditing = !isEditing

        val saveItem = viewBinding.myToolbar.menu.findItem(R.id.action_done)
        saveItem.isVisible = isEditing

    }
}

জাভা

public class ExampleFragment extends Fragment {
    ...
    public void updateToolbar() {
        isEditing = !isEditing;

        MenuItem saveItem = viewBinding.myToolbar.getMenu().findItem(R.id.action_done);
        saveItem.setVisible(isEditing);
    }

}

উপস্থিত থাকলে, টুলবারের শুরুতে নেভিগেশন বোতামটি দেখা যায়। টুলবারে নেভিগেশন আইকন সেট করলে সেটি দেখা যায়। এছাড়াও, আপনি নেভিগেশন-নির্দিষ্ট onClickListener() সেট করতে পারেন যা ব্যবহারকারী নেভিগেশন বোতামে ক্লিক করলেই কল করা হয়, যেমনটি নিম্নলিখিত উদাহরণে দেখানো হয়েছে:

Kotlin

class ExampleFragment : Fragment() {
    ...
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        ...
        myToolbar.setNavigationIcon(R.drawable.ic_back)

        myToolbar.setNavigationOnClickListener { view ->
            // Navigate somewhere.
        }
    }
}

জাভা

public class ExampleFragment extends Fragment {
    ...
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        ...
        viewBinding.myToolbar.setNavigationIcon(R.drawable.ic_back);
        viewBinding.myToolbar.setNavigationOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // Navigate somewhere.
            }
        });
    }
}