टूलबार को टुकड़े से कैसे प्राप्त करें?


107

मैं ActionBarActivityके साथ NavigationDrawerऔर उपयोग support_v7 ToolbarActionBar के रूप में। मेरे एक टुकड़े में टूलबार का कस्टम दृश्य है। अन्य अंशों में Toolbarशीर्षक दिखाना चाहिए।

Toolbarटुकड़ों से कस्टमाइज़ करने के लिए उदाहरण कैसे मिलता है ? मैं ActionBar के साथ मिल सकता है getActivity().getActionBar(), लेकिन अगर मैं setTitle()इस उदाहरण के लिए ActionBar कहता हूं तो यह कुछ नहीं करता है।

युपीडी:

मेरे मामले में

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

(जैसा कि MrEngineer13 ने कहा) पहले खंड निर्माण पर काम नहीं करते क्योंकि मैं इसे onHiddenChanged () से कहता हूं। अब मैं onCreateView () में एक और जोड़ देता हूं और यह ठीक काम करता है।


टुकड़ों में एक्शनबार्स / टूलबार गतिविधियाँ नहीं होती हैं
tyczj

(MainAcivity) this.getActivity ()) getToolbar ()।; सही उत्तर होगा !! टुकड़ा में टूलबार प्राप्त करने के लिए !!
LOG_TAG

जवाबों:


201

आप से आपकी गतिविधि कास्ट करने के लिए की जरूरत getActivity()के लिए AppCompatActivityपहले। यहाँ एक उदाहरण है:

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

आपको इसे डालने का कारण यह है क्योंकि getActivity()रिटर्न एक है FragmentActivityऔर आपको इसकी आवश्यकता हैAppCompatActivity

कोटलिन में:

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

8
'supportActionBar' और 'toolbar' मिलना एक ही बात है?
डारपन

@ डार्पन को यकीन नहीं है
कोन्स्टेंटिन कोनपोको

यदि मैं इसे जोड़ता हूं, तो इसका शीर्षक बदल रहा है .. लेकिन यदि मैं मूल गतिविधि पर वापस जाता हूं, तो शीर्षक को फिर से कैसे बदलना है? मेरा मतलब है कि मेरे पास एक नौसेना दराज है। साइड ड्रावर में कुछ अंश होते हैं और मुख्य गतिविधि का अपना शीर्षक होता है। जब मैंने मुख्य गतिविधि का शीर्षक निर्धारित किया, तो यह काम करता है और टुकड़े-टुकड़े में, जिस तरह से आपने उल्लेख किया है वह सही काम करता है। लेकिन मुझे वापस जाने पर गतिविधि का शीर्षक कैसे बदलना चाहिए?
Kylo Ren

82

अगर टुकड़े में टूलबार का कस्टम दृश्य होना चाहिए तो आप प्रत्येक टुकड़े के लिए टूलबार को अलग से लागू कर सकते हैं।

ToolBar को fragment_layout में जोड़ें:

<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"/>

इसे खंड में खोजें:

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

मेनू श्रोता को दो तरीके से बनाया जा सकता है: ओवरराइड करें। यह आपके टुकड़े में चयनित है:

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

या टूलबार के लिए श्रोता सेट करें जब इसे onCreateView () में बनाएँ:

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

1
मैं सिर्फ यह करने के लिए सही तरीके की पुष्टि करना चाहता हूं? अगर हम व्यूपेजर + टैबलेआउट या पगेरटेबस्ट्रिप में टूलबार के साथ अलग-अलग टुकड़े लोड करते हैं तो यह स्वाइप करते समय ऐप के प्रदर्शन को प्रभावित करेगा?
LOG_TAG

1
@LOG_TAG मैं टूलबार को लागू करने वाले प्रत्येक टुकड़े के साथ एक दराज डिजाइन है (और इस तरह यह लेआउट फ़ाइल में एक टूलबार है) और उपरोक्त कोड ने मेरे लिए बहुत अच्छा काम किया।
मैटबूतदेव

धन्यवाद! HeyUL की तरह काम किया !! :), Btw, onOptionsItemSelected()कोड की पुनरावृत्ति से बचने के लिए, फ्रैगमेंट की बजाय पैरेंट एक्टिविटी को ओवरराइड करने के लिए बेहतर है ।
आदित्य नाइक

@ChadMx नहीं, क्यों उन्होंने xml और इतने पर टूलबार को जोड़ने के बारे में भी लिखा। लेखक ने पूछा कि टूलबार को क्रमबद्ध रूप से टुकड़े से कैसे प्राप्त किया जाए। तो stackoverflow.com/a/26998718/4548520 यह सबसे अच्छा / सही उत्तर है और यह छोटा है
user25

43

टूलबार को खंड में लाने के लिए आपके पास दो विकल्प हैं

पेहला

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

और दूसरा एक

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

लेकिन क्या यह सही तरीका है .. bcoz हमें मिल गया है।
Code_Life

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

2

Kotlin उपयोगकर्ताओं के लिए (activity as AppCompatActivity).supportActionBar?.show()


!!के साथ पूरी तरह से परहेज है ?और यह आपको एक संभावित दुर्घटना से
बचाएगा

मेरा मानना ​​है कि यह बेहतर है(activity as? AppCompatActivity)?.supportActionBar?.show()
जॉनजेरेट

1

getActivity().getSupportActionBar().setTitle()अगर आपको support_v7 का उपयोग करना है तो शायद आपको प्रयास करना होगा।


1

अपने टुकड़े से: (टुकड़ा से टूलबार मिलता है?)

// 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();

यह बहुत उपयोगी है जब आप टूलबार में स्पिनर का उपयोग कर रहे हैं और एक टुकड़े से टूलबार में स्पिनर या कस्टम दृश्य कहते हैं!

आपकी गतिविधि से:

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

3
आपको अपनी गतिविधि में एक विधि प्राप्त करनी होगी जिसे गेटटलबार () कहा जाता है , जो खराब है, क्योंकि यह नहीं है कि गतिविधि और टुकड़े के बीच संचार कैसे किया जाना चाहिए।
मार्को

2
हाँ इसके लिए कोई और रास्ता नहीं है !! नेविगेशन दराज के कई काम केवल इस शैली को लागू करते हैं !!! कुछ समय के लिए हमें AppCompatActivity (AppCompatActivity) getActivity () की वजह से कास्ट करने की जरूरत है जो एक और दर्द बिंदु है !!! यह सब सामान पूरी तरह से देव समय को मारता है :(
LOG_TAG

1

XML में

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

कोटलिन: टुकड़ा में। -> 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

मैंने इन चरणों का उपयोग करके किया।

  1. onCreateViewमुख्य टुकड़े के नीचे कोड का उपयोग करके शीर्षक सेट करें ।
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your title");
  1. टुकड़े के बीच स्वैपिंग के लिए मैं नीचे नेविगेशन बार का उपयोग कर रहा हूं, जो टुकड़े के MainActivity(पेरेंट एक्टिविटी) पर लागू है । यहां तक ​​कि अगर आप किसी भी बटन या मेनू आइटम का उपयोग कर रहे हैं, तो आप शीर्षक को बदल सकते हैं onSelectedItemClickListener, जैसे मैंने अपने मामले में किया था।
    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

यदि आप कस्टम टूलबार या एक्शनबार का उपयोग कर रहे हैं और आप अपने टूलबार / एक्शन बार का संदर्भ फ्रैगमेंट से प्राप्त करना चाहते हैं तो आपको सबसे पहले नीचे की तरह फ्रेगमेंट के ऑनक्रिएट व्यू पद्धति से अपनी मुख्य गतिविधि का उदाहरण प्राप्त करना होगा ।

MainActivity activity = (MainActivity) getActivity();

फिर नीचे की तरह आगे के कार्यान्वयन के लिए गतिविधि का उपयोग करें

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

इसे कॉल करने से पहले, आपको अपने कस्टम टूलबार को नीचे के रूप में अपने MainActivity में इनिशियलाइज़ करना होगा।

पहला सेट अपने टूलबार को सार्वजनिक रूप से परिभाषित करें

public Toolbar toolbar;
public ActionBar actionBar;

और onCreate () विधि कस्टम टूलबार आईडी असाइन करें

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

बस। यह फ्रेगमेंट में काम करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.