Araç Çubuğunu parçadan nasıl alabilirim?


107

Ben ActionBarActivityile NavigationDrawerve kullanım support_v7 Toolbarİşlem Çubuğu olarak. Parçalarımdan birinde araç çubuğunun özel görünümü var. Diğer parçalarda Toolbarbaşlık gösterilmelidir.

ToolbarParçalardan özelleştirmek için nasıl örnek alınır? ActionBar'ı alabilirim getActivity().getActionBar(), ancak setTitle()bu örnek ActionBar'ı çağırırsam hiçbir şey yapmaz.

UPD:

Benim durumumda

((ActionBarActivity) getActivity()).getSupportActionBar().setTitle();

(MrEngineer13'ün dediği gibi) ilk parça oluşturmada çalışmıyor çünkü ben onu onHiddenChanged () olarak adlandırıyorum. Şimdi onCreateView () 'a bir tane daha ekliyorum ve iyi çalışıyor.


parçaların eylem çubukları / araç çubuğu etkinlikleri yok
tyczj

(MainAcivity) this.getActivity ()). GetToolbar (); doğru cevap olacak !! Araç Çubuğunu parça parça almak için !!
LOG_TAG

Yanıtlar:


201

Sen tüm etkinliklerinizi döküm gerekir getActivity()için AppCompatActivityilk. İşte bir örnek:

((AppCompatActivity) getActivity()).getSupportActionBar().setTitle();

Bunu yapmak zorunda olmanızın nedeni getActivity(), bir döndürür FragmentActivityve birAppCompatActivity

Kotlin'de:

(activity as AppCompatActivity).supportActionBar?.title = "My Title"

8
'supportActionBar' ve 'araç çubuğunu' almak aynı şey mi?
Darpan

@Darpan emin değilim
Konstantin Konopko

Bunu eklersem, başlığı değiştiririm .. Ama ana etkinliğe geri dönersem, başlığı nasıl değiştiririm? Demek istediğim, bir nav çekmecem var. Yan çekmecede bazı parçalar var ve ana faaliyetin kendi başlığı var. Ana faaliyetin başlığını belirlediğimde işe yarıyor ve parça parça, bahsettiğiniz yol mükemmel çalıştı. Ama geri dönerken aktivitenin başlığını nasıl değiştirmeliyim?
Kylo Ren

82

Parçaların ToolBar'ın özel görünümüne sahip olması gerektiğinde, her parça için ayrı ayrı ToolBar uygulayabilirsiniz.

ToolBar'ı fragment_layout'a ekleyin:

<android.support.v7.widget.Toolbar
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/toolbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/colorPrimaryDark"/>

parçada bul:

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment, container, false);
        Toolbar toolbar = (Toolbar) view.findViewById(R.id.toolbar);

        //set toolbar appearance
        toolbar.setBackground(R.color.material_blue_grey_800);

        //for crate home button
        AppCompatActivity activity = (AppCompatActivity) getActivity();
        activity.setSupportActionBar(toolbar);
        activity.getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

menü dinleyicisi iki yolla oluşturulabilir: parçanızda onOptionsItemSelected öğesini geçersiz kılma:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()){
        case android.R.id.home:
            getActivity().onBackPressed();
    }
    return super.onOptionsItemSelected(item);
}

veya onCreateView () içinde oluştururken araç çubuğu için dinleyiciyi ayarlayın:

toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() {
            @Override
            public boolean onMenuItemClick(MenuItem menuItem) {
                return false;
            }
        });

1
Bunu yapmanın doğru yolu olduğunu doğrulamak istiyorum. viewpager + Tablayout veya Pagertabstripe'de araç çubuğuyla farklı parçalar yüklersek, kaydırma sırasında uygulama performansını etkiler mi?
LOG_TAG

1
@LOG_TAG Araç çubuğunu uygulayan (ve dolayısıyla onun düzen dosyasında bir araç çubuğuna sahip olan) her parçayla bir çekmece tasarımım var ve yukarıdaki kod benim için harika çalıştı.
MattBoothDev

Teşekkürler! HEYUL gibi çalıştı !! :) Btw, onOptionsItemSelected()kod tekrarını önlemek için Fragment'ler yerine ana Etkinlikleri geçersiz kılmak daha iyidir .
Aditya Naique

@ChadMx hayır, neden xml'de araç çubuğu ekleme hakkında yazmıştı. Yazar, parçadan programlı olarak araç çubuğunun nasıl alınacağını sordu. Yani stackoverflow.com/a/26998718/4548520 bu en iyi / doğru cevap ve kısa
kullanıcı25

43

Araç Çubuğunu parça parça almak için iki seçeneğiniz var

Birincisi

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);

ve ikincisi

Toolbar toolbar = ((MainActivity) getActivity()).mToolbar;

Ama bu doğru yol mu .. bcoz bizde getSupportedActionBar da var mı?
Code_Life

9
toolbar = (Toolbar) getView().findViewById(R.id.toolbar);
AppCompatActivity activity = (AppCompatActivity) getActivity();
activity.setSupportActionBar(toolbar);

2

Kotlin kullanıcıları için (activity as AppCompatActivity).supportActionBar?.show()


!!ile tamamen önlenebilir ?ve sizi olası bir çökmeden kurtaracak
JonZarate

Bunun daha iyi olduğuna inanıyorum(activity as? AppCompatActivity)?.supportActionBar?.show()
JonZarate

1

Belki getActivity().getSupportActionBar().setTitle()support_v7 kullanıyorsanız denemelisiniz .


1

Parçanızdan: (Araç Çubuğunu parçadan al?)

// get toolbar
((MainAcivity)this.getActivity()).getToolbar();  // getToolbar will be method in Activity that returns Toolbar!!  don't use getSupportActionBar for getting toolbar!!
// get action bar
this.getActivity().getSupportActionBar();

Bu, Araç Çubuğunda döndürücüyü kullanırken ve bir parçadan Araç Çubuğu'ndaki döndürücüyü veya özel görünümleri çağırdığınızda çok yararlıdır !

Etkinliğinizden:

// get toolbar
this.getToolbar();
// get Action Bar
this.getSupportActionBar();

3
Aktivitenizde getToolbar () adında bir yönteme sahip olmalısınız , ki bu kötüdür, çünkü aktivite ile parça arasındaki iletişim bu şekilde yapılmamalıdır.
Marko

2
evet bunun başka yolu yok !! gezinti çekmecesi kitaplıklarının çoğu yalnızca bu stili uygular !!! Bazı zamanlar, başka bir sorun noktası olan AppCompatActivity (AppCompatActivity) getActivity () nedeniyle etkinliği atmamız gerekir !!! tüm bunlar geliştirme zamanını tamamen öldürüyor :(
LOG_TAG

1

XML olarak

 <androidx.appcompat.widget.Toolbar
  android:id="@+id/main_toolbar"
  android:layout_width="match_parent"
  android:layout_height="?attr/actionBarSize"
  app:layout_scrollFlags="scroll|enterAlways">
 </androidx.appcompat.widget.Toolbar>

Kotlin: fragment.kt içinde -> onCreateView ()

setHasOptionsMenu(true)

val toolbar = view.findViewById<Toolbar>(R.id.main_toolbar)

(activity as? AppCompatActivity)?.setSupportActionBar(toolbar)

(activity as? AppCompatActivity)?.supportActionBar?.show()

-> onCreateOptionsMenu ()

   override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
       inflater.inflate(R.menu.app_main_menu,menu)
       super.onCreateOptionsMenu(menu, inflater)
   }

-> onOptionsItemSelected ()

   override fun onOptionsItemSelected(item: MenuItem): Boolean {
        return when (item.itemId) {
             R.id.selected_id->{//to_do}
             else -> super.onOptionsItemSelected(item)
        }
    }

0

Bu adımları kullanarak yaptım.

  1. onCreateViewAna parçadaki aşağıdaki kodu kullanarak Başlığı ayarlayın .
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your title");
  1. Parçalar arasında geçiş yapmak için parçanın MainActivity(Ana Etkinlik) üzerinde uygulanan alt gezinme çubuğunu kullanıyorum . Herhangi bir düğme veya menü öğesini kullanıyor olsanız bile onSelectedItemClickListener, tıpkı benim durumumda yaptığım gibi , başlığını değiştirebilirsiniz .
    public boolean onNavigationItemSelected(@NonNull MenuItem menuItem) {
        switch (menuItem.getItemId()){
            case R.id.menu_dashboard:
                getSupportActionBar().setTitle("Dashboard");
                fm.beginTransaction().hide(active).show(dashboardFragment).commit();
                active = dashboardFragment;
                return true;
            case R.id.menu_workshop:
                getSupportActionBar().setTitle("Workshops");
                fm.beginTransaction().hide(active).show(workshopFragment).commit();
                active = workshopFragment;
                return true;
         }
         return false;
    }

0

Özel araç çubuğu veya ActionBar kullanıyorsanız ve Fragments'tan araç çubuğunuzun / eylem çubuğunuzun referansını almak istiyorsanız, önce aşağıdaki gibi Fragment'ın onCreateView Yönteminden Ana Etkinliğinizin örneğini almanız gerekir .

MainActivity activity = (MainActivity) getActivity();

daha sonra aşağıdaki gibi daha fazla uygulama için etkinliği kullanın

ImageView vRightBtn = activity.toolbar.findViewById(R.id.toolbar_right_btn);

Bunu çağırmadan önce, MainActivity'de özel araç çubuğunuzu aşağıdaki gibi başlatmanız gerekir.

İlk olarak araç çubuğunuzu genel olarak tanımlayın

public Toolbar toolbar;
public ActionBar actionBar;

ve onCreate () Yönteminde özel araç çubuğu kimliğini atayın

toolbar = findViewById(R.id.custom_toolbar);
setSupportActionBar(toolbar);
actionBar = getSupportActionBar();

Bu kadar. Fragment'te çalışacak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.