AppBar ile çalışma

Üst uygulama çubuğu, geçerli ekrandaki bilgileri ve işlemleri görüntülemek için uygulama pencerenizin üst kısmında tutarlı bir yer sağlar.

üst uygulama çubuğu örneği
Şekil 1. Üst taraftaki uygulama çubuğu örneği.

Uygulama çubuğunun sahipliği, uygulamanızın ihtiyaçlarına göre değişir. Parça kullanırken uygulama çubuğu, ana makine etkinliğine veya parçanızın düzenindeki bir araç çubuğuna ait bir ActionBar olarak uygulanabilir.

Tüm ekranlarınız, her zaman üstte yer alan ve ekranın genişliğini kapsayan aynı uygulama çubuğunu kullanıyorsa etkinlik tarafından barındırılan ve tema tarafından sağlanan bir işlem çubuğu kullanın. Tema uygulama çubukları kullanmak, tutarlı bir görünüm sunmaya yardımcı olur ve seçenek menüleri ile Yukarı düğmesi barındırmak için bir yer sağlar.

Birden fazla ekranda uygulama çubuğunun boyutu, yerleşimi ve animasyonu üzerinde daha fazla kontrol sahibi olmak istiyorsanız parça tarafından barındırılan bir araç çubuğu kullanın. Örneğin, daraltılabilen bir uygulama çubuğuna veya ekranın yalnızca yarısını kaplayan ve dikey olarak ortalanmış bir uygulama çubuğuna ihtiyacınız olabilir.

Menüleri şişirme ve kullanıcı etkileşimine yanıt verme gibi farklı durumlar için farklı yaklaşımlar gerekir. Farklı yaklaşımları anlamak ve uygulamanız için en iyi olanı kullanmak size zaman kazandırır ve uygulamanızın düzgün bir şekilde çalışmasını sağlar.

Bu konudaki örnekler, düzenlenebilir profil içeren bir ExampleFragment öğesine referansta bulunur. Parça, uygulama çubuğunda aşağıdaki XML tanımlı menüyü şişirir:

<!-- 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>

Menüde iki seçenek bulunur: biri profil ekranına gitmek, diğeri de profilde yapılan değişiklikleri kaydetmek için.

Etkinliğe ait uygulama çubuğu

Uygulama çubuğu, genellikle ana makine etkinliğine aittir. Uygulama çubuğunun sahibi bir etkinlik olduğunda parçalar, oluşturma sırasında çağrılan çerçeve yöntemlerini geçersiz kılarak uygulama çubuğuyla etkileşim kurabilir.

Etkinlikle kaydol

Uygulama çubuğu parçanızın seçenekler menüsünü doldurmaya katıldığını sisteme bildirmeniz gerekir. Bunu yapmak için parçanızın onCreate(Bundle) yönteminde setHasOptionsMenu(true) yöntemini aşağıdaki örnekte gösterildiği gibi çağırın:

Kotlin

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

Java

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

setHasOptionsMenu(true), sisteme parçanızın menüyle ilgili geri çağırmalar almak istediğini bildirir. Etkinlik işleme yöntemi, tıklama gibi menüyle ilgili bir etkinlik gerçekleştiğinde, parçada çağrılmadan önce ilk olarak etkinlikte çağrılır.

Ancak uygulama mantığınızda bu sırayı temel almayın. Aynı etkinlik birden fazla parça barındırıyorsa her parça menü seçeneklerini sağlayabilir. Bu durumda, geri çağırma sırası parçaların eklenme sırasına bağlıdır.

Menüyü şişirme

Menünüzü uygulama çubuğunun seçenekler menüsüyle birleştirmek için parçanızda onCreateOptionsMenu() öğesini geçersiz kılın. Bu yöntem, geçerli uygulama çubuğu menüsünü ve parametre olarak bir MenuInflater değerini alır. Parçanızın menüsünün bir örneğini oluşturmak için menü genişleticiyi kullanın ve ardından aşağıdaki örnekte gösterildiği gibi bunu geçerli menüyle birleştirin:

Kotlin

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

Java

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

Şekil 2'de güncellenen menü gösterilmiştir.

seçenekler menüsü artık menü parçanızı içeriyor
Şekil 2. Seçenekler menüsü artık menü parçanızı içeriyor.

Tıklama etkinliklerini işleme

Seçenekler menüsünde yer alan her etkinlik ve parça, dokunma hareketlerine yanıt verebilir. Parçanın onOptionsItemSelected() özelliği, seçilen menü öğesini parametre olarak alır ve dokunmanın kullanılıp kullanılmadığını belirtmek için bir boole döndürür. Bir etkinlik veya parça onOptionsItemSelected() öğesinden true değerini döndürdüğünde, katılan diğer parçalar geri çağırmayı almaz.

onOptionsItemSelected() uygulamanızda, menü öğesinin itemId kısmında bir switch ifadesi kullanın. Seçilen öğe size aitse dokunmayı uygun şekilde kullanın ve tıklama etkinliğinin işlendiğini belirtmek için true değerini döndürün. Seçilen öğe size ait değilse super uygulamasını çağırın. Varsayılan olarak, super uygulaması, menü işlemeye devam etmek için false değerini döndürür.

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

Java

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

    }

}

Menüyü dinamik olarak değiştirme

onPrepareOptionsMenu()'te düğmeleri gizleme veya gösterme ya da simgeyi değiştirme mantığını yerleştirin. Bu yöntem, menü gösterilmeden hemen önce çağrılır.

Önceki örnekten devam edersek, Kaydet düğmesi kullanıcı düzenlemeye başlayana kadar görünmez ve kullanıcı kaydettikten sonra kaybolur. Bu mantığı onPrepareOptionsMenu() öğesine eklemek menünün doğru şekilde sunulmasını sağlar:

Kotlin

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

Java

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

Menüyü güncellemeniz gerektiğinde (ör. bir kullanıcı, profil bilgilerini düzenlemek için Düzenle düğmesine bastığında) sistemin onCreateOptionsMenu() çağrısı yapmasını istemek için ana makine etkinliğinde invalidateOptionsMenu() numaralı telefonu arayın. Geçersiz kılma işleminden sonra, güncellemeleri onCreateOptionsMenu() üzerinden yapabilirsiniz. Menü genişlediğinde sistem onPrepareOptionsMenu() öğesini çağırır ve menüyü parçanın mevcut durumunu yansıtacak şekilde günceller.

Kotlin

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

Java

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

Bir parçaya ait uygulama çubuğu

Uygulamanızdaki çoğu ekranda uygulama çubuğu gerekmiyorsa veya bir ekranda diğerlerinden farklı bir uygulama çubuğu gerekiyorsa parça düzeninize Toolbar ekleyebilirsiniz. Parçanızın görünüm hiyerarşisinde herhangi bir yere Toolbar ekleyebilirsiniz ancak bu öğe genellikle ekranın en üstünde tutulur. Parçanızda Toolbar kullanmak için bir kimlik sağlayın ve diğer tüm görünümlerde olduğu gibi parçanızda buna bir referans alın. Araç çubuğunu, CoordinatorLayout davranışlarını kullanarak da canlandırabilirsiniz.

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

Google, parçaya ait bir uygulama çubuğu kullanırken doğrudan Toolbar API'lerinin kullanılmasını önerir. Yalnızca etkinliğe ait uygulama çubukları için uygun olan setSupportActionBar() ve Fragment menü API'lerini kullanmayın.

Menüyü şişirme

Toolbar kolay kullanım yöntemi inflateMenu(int), bir menü kaynağının kimliğini parametre olarak alır. Bir XML menü kaynağını araç çubuğunuza genişletmek için resId öğesini, aşağıdaki örnekte gösterildiği gibi bu yönteme iletin:

Kotlin

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

Java

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

}

Başka bir XML menü kaynağını şişirmek için yeni menünün resId ile yöntemi tekrar çağırın. Yeni menü öğeleri menüye eklenir, mevcut menü öğeleri değiştirilmez veya kaldırılmaz.

Mevcut menü grubunu değiştirmek isterseniz aşağıdaki örnekte gösterildiği gibi, inflateMenu(int) yöntemini çağırmadan önce menüyü temizleyin:

Kotlin

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

Java

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

        viewBinding.myToolbar.getMenu().clear()

    }

}

Tıklama etkinliklerini işleme

OnMenuItemClickListener öğelerini setOnMenuItemClickListener() yöntemini kullanarak doğrudan araç çubuğuna aktarabilirsiniz. Bu işleyici, kullanıcı araç çubuğunun sonunda sunulan işlem düğmelerinden veya ilgili taşma öğesinde bir menü öğesi seçtiğinde çağrılır. Seçilen MenuItem, işleyicinin onMenuItemClick() yöntemine aktarılır ve aşağıdaki örnekte gösterildiği gibi işlemi kullanmak için kullanılabilir:

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

Java

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

Menüyü dinamik olarak değiştirme

Parçanız uygulama çubuğuna sahip olduğunda çalışma zamanında Toolbar öğesini tıpkı diğer görünümlerde olduğu gibi değiştirebilirsiniz.

Önceki örnekten devam edersek, Kaydet menü seçeneği, kullanıcı düzenlemeye başlayana kadar görünmez olmalı ve dokunulduğunda tekrar kaybolmalıdır:

Kotlin

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

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

    }
}

Java

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

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

}

Araç çubuğunun başında gezinme düğmesi (varsa) görünür. Araç çubuğuna bir gezinme simgesi ayarlamak, araç çubuğunu görünür hale getirir. Ayrıca aşağıdaki örnekte gösterildiği gibi, kullanıcı gezinme düğmesini tıkladığında çağrılan, gezinmeye özel bir onClickListener() ayarlayabilirsiniz:

Kotlin

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

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

Java

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