फ्रैगमेंट से कस्टम एक्शनबार टाइटल सेट करना


90

मेरे मेन में FragmentActivity, मैंने अपना कस्टम ActionBarशीर्षक इस तरह सेट किया:

    LayoutInflater inflator = (LayoutInflater) this
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View v = inflator.inflate(R.layout.custom_titlebar, null);

    TextView tv = (TextView) v.findViewById(R.id.title);
    Typeface tf = Typeface.createFromAsset(this.getAssets(),
            "fonts/capsuula.ttf");
    tv.setTypeface(tf);
    tv.setText(this.getTitle());

    actionBar.setCustomView(v);

यह सही काम करता है। हालांकि, एक बार जब मैं अन्य खोल देता हूं Fragments, तो मैं चाहता हूं कि शीर्षक बदल जाए। मुझे यकीन नहीं है कि ऐसा करने के लिए मुख्य तक कैसे पहुंचें Activity? अतीत में, मैंने यह किया:

((MainFragmentActivity) getActivity()).getSupportActionBar().setTitle(
            catTitle);

क्या कोई उचित विधि पर सलाह दे सकता है?

एक्सएमएल:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/transparent" >

    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_marginLeft="5dp"
        android:ellipsize="end"
        android:maxLines="1"
        android:text=""
        android:textColor="#fff"
        android:textSize="25sp" />

</RelativeLayout>

stackoverflow.com/a/28279341/1651286 को इसकी मापनीयता के कारण स्वीकृत उत्तर होना चाहिए। क्योंकि अन्य सभी दृष्टिकोण विशेष गतिविधि से बंधे हुए टुकड़े कर रहे हैं, जो कि एक स्केलेबल डिज़ाइन नहीं है, क्या होगा यदि एक ही टुकड़े को कई गतिविधियों के साथ उपयोग किया जाना है, यह भी यही है कि एंड्रॉइड फ्रेमवर्क भी सिफारिश करता है।
अखिल पिताजी

जवाबों:


98

=== अपडेट अक्टूबर, 30, 2019 ===

चूंकि हमारे पास ViewModel और LiveData जैसे नए घटक हैं ViewModel और लाइव डेटा का उपयोग करके फ़्रैगमेंट से गतिविधि शीर्षक अपडेट करने का एक अलग / आसान तरीका हो सकता है

गतिविधि

class MainActivity : AppCompatActivity() {
private lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main_activity)
    if (savedInstanceState == null) {
        supportFragmentManager.beginTransaction()
            .replace(R.id.container, MainFragment.newInstance())
            .commitNow()
    }
    viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
    viewModel.title.observe(this, Observer {
        supportActionBar?.title = it
    })
} }

MainFragment

class MainFragment : Fragment() {
companion object {
    fun newInstance() = MainFragment()
}
private lateinit var viewModel: MainViewModel
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View {
    return inflater.inflate(R.layout.main_fragment, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    activity?.run {
        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
    } ?: throw Throwable("invalid activity")
    viewModel.updateActionBarTitle("Custom Title From Fragment")
} }

और MainModelView:

class MainViewModel : ViewModel() {
private val _title = MutableLiveData<String>()
val title: LiveData<String>
get() = _title
fun updateActionBarTitle(title: String) = _title.postValue(title) }

और फिर आप Fragment का उपयोग करके गतिविधि शीर्षक को अपडेट कर सकते हैं viewModel.updateActionBarTitle("Custom Title From Fragment")

=== अपडेट अप्रैल, 10, 2015 ===

आपको अपना एक्शन बार शीर्षक अपडेट करने के लिए श्रोता का उपयोग करना चाहिए

टुकड़ा:

public class UpdateActionBarTitleFragment extends Fragment {
    private OnFragmentInteractionListener mListener;

    public UpdateActionBarTitleFragment() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        if (mListener != null) {
            mListener.onFragmentInteraction("Custom Title");
        }
        return inflater.inflate(R.layout.fragment_update_action_bar_title2, container, false);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            mListener = (OnFragmentInteractionListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    public interface OnFragmentInteractionListener {
        public void onFragmentInteraction(String title);
    }
}

और गतिविधि:

public class UpdateActionBarTitleActivity extends ActionBarActivity implements UpdateActionBarTitleFragment.OnFragmentInteractionListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_update_action_bar_title);
    }

    @Override
    public void onFragmentInteraction(String title) {
        getSupportActionBar().setTitle(title);
    }
}

यहां पढ़ें: https://developer.android.com/training/basics/fragments/communicating.html


1
यह मेरे लिए काम किया! मैंने गतिविधि में इसके बजाय getActionBar ()। SetTitle (शीर्षक) का उपयोग किया। धन्यवाद
luckyreed76

1
बिल्कुल वही जो मैं चाह रहा था- मेरे लिए चुने गए जवाब से बेहतर काम किया। धन्यवाद!
dstrube

1
यह स्वीकृत उत्तर होना चाहिए! यह सही ढंग से दिखाता है कि यह कैसे किया जाना चाहिए: यदि एक टुकड़ा अपनी होस्टिंग गतिविधि के साथ संवाद करना चाहता है, तो संचार हमेशा एक इंटरफ़ेस के माध्यम से होना चाहिए। टुकड़ा इंटरफ़ेस प्रदान करता है और गतिविधि इसे लागू करती है! यदि कई अंशों को एक गतिविधि के साथ उसी तरह से संवाद करना है, तो एक सार टुकड़ा लिखें जो इंटरफ़ेस प्रदान करता है और फिर इस "आधार टुकड़ा" से प्रत्येक टुकड़े को विरासत में मिलता है।
विंकलार्र

3
वैसे: इस उत्तर में प्रयुक्त onAttach (गतिविधि) विधि को इस समय तक हटा दिया जाता है। onAttach(Context)पारित होस्ट गतिविधि को पूरा करने के लिए विधि के अंदर की जाँच करें आवश्यक इंटरफ़ेस लागू करता है (के माध्यम से मेजबान गतिविधि को पुनः प्राप्त context.getActivity())।
winklerrr

2
कई वर्षों के बाद मैंने इसे स्वीकार किए गए उत्तर में बदल दिया क्योंकि जैसा कि हम जानते हैं, इंटरफेस एक तरह से टुकड़े हैं और गतिविधियों को संवाद करने की आवश्यकता है।
द लेटिसमास्टर

150

आप जो कर रहे हैं वह सही है। एपीआई Fragmentsतक पहुंच नहीं है ActionBar, इसलिए आपको कॉल करना होगा getActivity। जब तक आपका Fragmentकोई स्टेटिक इनर क्लास नहीं होता है, उस स्थिति में आपको WeakReferenceपैरेंट को कॉल करना चाहिए और एक्टिविटी को कॉल करना चाहिए । getActionBarवहां से।

ActionBarकस्टम लेआउट का उपयोग करते हुए, अपने लिए शीर्षक सेट करने के लिए , Fragmentआपको कॉल करने की आवश्यकता होगी getActivity().setTitle(YOUR_TITLE)

आपके द्वारा कॉल किए जाने setTitleका कारण यह है कि आप getTitleअपने शीर्षक के रूप में कह रहे हैं ActionBargetTitleउसके लिए शीर्षक देता है Activity

आप कॉल प्राप्त नहीं करना चाहते हैं getTitle, तो आप एक सार्वजनिक विधि बनाने की आवश्यकता होगी कि सेट अपने के पाठ TextViewमें Activityहै कि मेजबान Fragment

आपकी गतिविधि में :

public void setActionBarTitle(String title){
    YOUR_CUSTOM_ACTION_BAR_TITLE.setText(title);
}

अपने फसाद में :

((MainFragmentActivity) getActivity()).setActionBarTitle(YOUR_TITLE);

डॉक्स:

Activity.getTitle

Activity.setTitle

इसके अलावा, आपको this.whateverदिए गए कोड में कॉल करने की आवश्यकता नहीं है , बस एक टिप।


मैं कोशिश करता हूं और मुझे यह काम नहीं मिल रहा है। इसकी कीमत के लिए, मैंने अपना पोस्ट किया XMLऔर "यह" भी हटा दिया। कोई बदलाव नहीं ... और नहीं, यह एक staticआंतरिक वर्ग नहीं है ।
TheLettuceMaster

रुको, क्या काम नहीं करता है? अपने ओपी में आप काम नहीं करने वाले किसी भी चीज़ का उल्लेख नहीं करते हैं, आप केवल ActionBarएक से शीर्षक सेट करने के लिए "उचित" विधि जानना चाहते हैं Fragment। इसके अलावा, मैं this.whateverकुछ भी करने के लिए एक समाधान के रूप में हटाने की पेशकश नहीं कर रहा था , कि केवल एक कोड स्वरूपण टिप था।
adneal

मुझे लगता है कि मैं समझता हूं कि आप किस समस्या से परेशान हैं और मेरे उत्तर को उसी अनुसार संपादित करें
3

थैंक्स पक्का जवाब
अम्मर अली

@KickingLettuce, मैं इस जवाब के साथ थोड़ी देर तक संघर्ष करता हूं जब तक कि मैंने इसे काम नहीं किया (यही कारण है कि मैंने इसे उखाड़ दिया, साथ ही साथ आपके प्रश्न): मेरे नेविगेशन-ड्रावर मुख्य गतिविधि ( menu_act) में मैंने वैश्विक "mTitle" बनाया, और, एक में टुकड़ा, पहले मैं "mTitle" ( ( (menu_act) getActivity() ).mTitle = "new_title") के लिए एक शीर्षक प्रदान करता हूं , और तुरंत मैं करता हूं ( (menu_act) getActivity() ).restoreActionBar();। "RestoreActionBar ()" के अंदर मेरे पास "ActionBar.setTitle (mTitle)" है।
जोस मैनुअल अबरका रोड्रिगेज

29

Google उदाहरण खंडों के भीतर इसका उपयोग करते हैं।

private ActionBar getActionBar() {
    return ((ActionBarActivity) getActivity()).getSupportActionBar();
}

टुकड़ा एक ActionBarActivity से संबंधित होगा और यही वह जगह है जहां एक्शनबार का संदर्भ है। यह क्लीनर है क्योंकि टुकड़ा को यह जानने की आवश्यकता नहीं है कि यह क्या गतिविधि है, इसे केवल एक्शनबेरक्टिविटी लागू करने वाली गतिविधि से संबंधित होना चाहिए। यह टुकड़े को अधिक लचीला बनाता है और कई गतिविधियों में जोड़ा जा सकता है जैसे कि वे हैं।

अब, आपको केवल उस टुकड़े में करने की आवश्यकता है।

getActionBar().setTitle("Your Title");

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

public abstract class BaseFragment extends Fragment {
    public ActionBar getActionBar() {
        return ((ActionBarActivity) getActivity()).getSupportActionBar();
    }
}

फिर तुम्हारे टुकड़े में।

public class YourFragment extends BaseFragment {
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        getActionBar().setTitle("Your Title");
    }
}

धन्यवाद। बहुत अच्छा समाधान, इस तरह से आप अपने एक्शन बार में कस्टम दृश्य भी पास कर सकते हैं।
अमीर

ActionBarActivity के बजाय Android SDK के हालिया अपडेट के साथ, यदि आप v7 बैकवर्ड कम्पेटिबिलिटी लाइब्रेरी (जो आपको शायद चाहिए) का उपयोग कर रहे हैं, तो आप AppCompatActivity को डाउनकास्ट कर सकते हैं।
fr4gus

8

जिम्मेदारी के स्तर Activityतक एक Fragmentगड़बड़ से शीर्षक का निर्धारण करना । Fragmentएक में निहित है Activity, इसलिए यह वह है Activity, जिसे Fragmentउदाहरण के प्रकार के अनुसार अपना शीर्षक निर्धारित करना चाहिए ।

मान लीजिए कि आपके पास एक इंटरफ़ेस है:

interface TopLevelFragment
{
    String getTitle();
}

वह Fragmentजो Activityइस शीर्षक को प्रभावित कर सकता है, फिर इस इंटरफ़ेस को लागू कर सकता है। होस्टिंग गतिविधि में आप लिखते हैं:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentManager fm = getFragmentManager();
    fm.beginTransaction().add(0, new LoginFragment(), "login").commit();
}

@Override
public void onAttachFragment(Fragment fragment)
{
    super.onAttachFragment(fragment);

    if (fragment instanceof TopLevelFragment)
        setTitle(((TopLevelFragment) fragment).getTitle());
}

इस तरीके Activityसे हमेशा नियंत्रण में रहता है कि किस शीर्षक का उपयोग करना है, भले ही कई TopLevelFragmentएस संयुक्त हों, जो एक टैबलेट पर काफी संभव है।


6

मुझे नहीं लगता कि स्वीकृत उत्तर इसके लिए एक सही उत्तर है। चूंकि सभी गतिविधियां जो उपयोग करती हैं

टूलबार

का उपयोग कर बढ़ाया जाता है

AppCompatActivity

, इसके द्वारा बुलाए गए टुकड़े शीर्षक बदलने के लिए नीचे दिए गए कोड का उपयोग कर सकते हैं।

((AppCompatActivity) context).getSupportActionBar().setTitle("Your Title");

5

इस खंड में हम इस तरह का उपयोग कर सकते हैं, यह मेरे लिए ठीक काम कर रहा है।

getActivity().getActionBar().setTitle("YOUR TITLE");

यह तब काम नहीं करता है जब हमारी गतिविधि के टूलबार में एक टेक्स्ट दृश्य होता है जिसमें शीर्षक की भूमिका होती है
शमौन

4

शायद ज़रुरत पड़े अगर आप कोड के साथ मुद्दों कर रहे हैं, डाल की कोशिश getSupportActionBar().setTitle(title)के अंदर onResume()के बजाय अपने टुकड़ा की onCreateView(...)यानी

में MainActivity.java :

public void setActionBarTitle(String title) {
    getSupportActionBar().setTitle(title);
}

टुकड़े में:

 @Override
 public void onResume(){
     super.onResume();
     ((MainActivity) getActivity()).setActionBarTitle("Your Title");
 }

यह मेरी समस्या थी - जहाँ मैं शीर्षक स्थापित कर रहा था। हालांकि, ((MainActivity) getActivity()).setTitle("title")पर्याप्त है। कोटलिन में, मेरा टुकड़ा करता है activity!!.title = "title
जो लैप

2

निम्न का उपयोग करें:

getActivity().setTitle("YOUR_TITLE");

यह उत्तर गतिविधि के शीर्षक को बदलने के लिए है, प्रश्न इसके बजाय ActionBar के शीर्षक के बारे में है।
डेविड डी सी ई फ्रीटास

धन्यवाद @ अनीसत्ती! बस यही मैंने फ्रैगमेंट क्लास में किया।
फ्रांसिस रोड्रिग्स

2

नेवीगेशनड्रॉलर का उपयोग करते समय, टुकड़ों से एक्शनबेर शीर्षक सेट करने के लिए मेरा समाधान है। यह समाधान एक इंटरफ़ेस का उपयोग करता है, इसलिए टुकड़ों को मूल गतिविधि को सीधे संदर्भित करने की आवश्यकता नहीं है:

1) एक इंटरफ़ेस बनाएँ:

public interface ActionBarTitleSetter {
    public void setTitle(String title); 
}

2) फ्रैगमेंट के onAttach में , गतिविधि को इंटरफ़ेस प्रकार में सेट करें और SetActivityTitle विधि कॉल करें:

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity);
    ((ActionBarTitleSetter) activity).setTitle(getString(R.string.title_bubbles_map)); 
}

3) गतिविधि में, ActionBarTitleSetter इंटरफ़ेस लागू करें:

@Override 
public void setTitle(String title) { 
    mTitle = title; 
}

यह स्वीकृत उत्तर होना चाहिए क्योंकि अन्य सभी दृष्टिकोण विशेष गतिविधि से जुड़े टुकड़े कर रहे हैं, जो एक स्केलेबल डिज़ाइन नहीं है, यह भी यही है कि एंड्रॉइड फ्रेमवर्क भी सिफारिश करता है
अखिल पिता

2

परिवर्तन शीर्षक के लिए सर्वश्रेष्ठ घटना onCreateOptionsMenu

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.general, container,  
    setHasOptionsMenu(true); // <-Add this line
    return view;
}

@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

    // If use specific menu
    menu.clear();
    inflater.inflate(R.menu.path_list_menu, menu);
    // If use specific menu

    ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your Fragment");
    super.onCreateOptionsMenu(menu, inflater);
}

2

एक सरल कोटलिन उदाहरण

इन ग्रेड डिप्स मैच को मान लें या आपकी परियोजना में उच्च संस्करण हैं:

kotlin_version = '1.3.41'
nav_version_ktx = '2.0.0'

इसे अपने खंड वर्गों में जोड़ें:

    /**
     * A simple [Fragment] subclass.
     *
     * Updates the action bar title when onResume() is called on the fragment,
     * which is called every time you navigate to the fragment
     *
     */

    class MyFragment : Fragment() {
    private lateinit var mainActivity: MainActivity

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {

       //[...]

        mainActivity = this.activity as MainActivity

       //[...]
    }

    override fun onResume() {
        super.onResume()
        mainActivity.supportActionBar?.title = "My Fragment!"
    }


    }

1

यदि आपके पास एक मुख्य गतिविधि है जिसमें आप कई टुकड़े डालते हैं, तो आमतौर पर नेविगेशनड्रावर का उपयोग किया जाता है। और आपके पास आपके टुकड़े करने के लिए एक शीर्षक है, जब आप वापस दबाते हैं, तो उन्हें बदलने के लिए, इसे मुख्य कार्य में डाल दें जो टुकड़े को पकड़ते हैं

@Override
     public void onBackPressed() {

    int T=getSupportFragmentManager().getBackStackEntryCount();
    if(T==1) { finish();}

    if(T>1) {
        int tr = Integer.parseInt(getSupportFragmentManager().getBackStackEntryAt(T-2).getName());
        setTitle(navMenuTitles[tr]);  super.onBackPressed();
      }

}

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

    fragmentManager.beginTransaction().
replace(R.id.frame_container, fragment).addToBackStack(position).commit();

अब, NavMenuTmarks आप onCreate पर लोड कुछ है

 // load slide menu items
        navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

सरणी xml स्ट्रिंग्स.xml पर एक सरणी प्रकार स्ट्रिंग संसाधन है

 <!-- Nav Drawer Menu Items -->
    <string-array name="nav_drawer_items">
        <item>Title one</item>
        <item>Title Two</item>
    </string-array>

1

स्ट्रिंग उत्तर को स्ट्रिंग [] ऑब्जेक्ट में सहेजें और इसे OnTabChange () को MainActivity में Downwww के रूप में सेट करें

String[] object = {"Fragment1","Fragment2","Fragment3"};

public void OnTabChange(String tabId)
{
int pos =mTabHost.getCurrentTab();     //To get tab position
 actionbar.setTitle(object.get(pos));
}


//Setting in View Pager
public void onPageSelected(int arg0) {
    mTabHost.setCurrentTab(arg0);
actionbar.setTitle(object.get(pos));
}

1

कास्टिंग के अपने दृष्टिकोण की तरह नकारात्मक पक्ष

((MainFragmentActivity) getActivity()).getSupportActionBar().setTitle(
        catTitle);

यह है कि आपका टुकड़ा अब MainActivityFragment के बाहर पुन: प्रयोज्य नहीं है। यदि आप इसे उस गतिविधि के बाहर उपयोग करने की योजना नहीं बनाते हैं, तो कोई समस्या नहीं है। एक बेहतर दृष्टिकोण सशर्त रूप से गतिविधि के आधार पर शीर्षक निर्धारित करेगा। तो आपके टुकड़े के अंदर, आप लिखेंगे:

if (getActivity() instanceof ActionBarActivity) {
    ((ActionBarActivity) getActivity()).getSupportActionBar().setTitle("Some Title");
}

1

अगर आप एंड्रॉइड स्टूडियो 1.4 स्टेबल टेम्प्लेट का उपयोग कर रहे हैं जो कि Google द्वारा प्रदान किया गया सरल है, तो आपको निम्नलिखित कोड को onNavigationItemSelectedमेथोड में लिखना होगा जिसमें आपकी संबंधित खंड कॉलिंग की स्थिति हो।

 setTitle("YOUR FRAGMENT TITLE");

यह अद्भुत है यदि आपके पास गतिविधि से सीधे शीर्षक तक पहुंच है ... लेकिन अगर शीर्षक एक गतिशील रूप से खंड में स्ट्रिंग है तो टुकड़े और गतिविधि के बीच संचार की आवश्यकता है
me_

1

मुझे किसी भी सिरदर्द के बिना किसी भी गतिविधि में टुकड़ा या किसी भी गतिविधि में एक्शनबार शीर्षक सेट करने के लिए एक बहुत ही सरल समाधान मिल रहा है।

बस नीचे दिए गए टूलबार को परिभाषित करने वाले xml को संशोधित करें:

<android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="@color/colorPrimaryDark"
            app:popupTheme="@style/AppTheme.PopupOverlay" >

            <TextView
                style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
                android:id="@+id/toolbar_title"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@string/app_name"
                />
            </android.support.v7.widget.Toolbar>

    </android.support.design.widget.AppBarLayout> 

1) यदि आप एक्शनबार को एक टुकड़े में सेट करना चाहते हैं तो:

Toolbar toolbar = findViewById(R.id.toolbar);
TextView toolbarTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);

कहीं से भी इसका उपयोग करने के लिए, आप गतिविधि में एक विधि को परिभाषित कर सकते हैं

public void setActionBarTitle(String title) {
        toolbarTitle.setText(title);
    }

गतिविधि में इस पद्धति को कॉल करने के लिए, बस इसे कॉल करें।

setActionBarTitle("Your Title")

गतिविधि के टुकड़े से इस पद्धति को कॉल करने के लिए, बस इसे कॉल करें।

((MyActivity)getActivity()).setActionBarTitle("Your Title");

अति उत्कृष्ट! अगर Android नेविगेशन कंपोनेंट्स का उपयोग करते हुए टूलबार_टिटेल का उपयोग करके खंड शीर्षक को ओवरराइड किया जाता है।
पैक्सॉल्स

0

बस चयनित उत्तर को जोड़ने के लिए, आप अपनी मुख्य गतिविधि में दूसरी विधि जोड़ना चाह सकते हैं। तो आप अपनी मुख्य गतिविधि में निम्नलिखित विधियों के साथ समाप्त होंगे:

public void setActionBarTitle(String title) {
    getSupportActionBar().setTitle(title);
}

public void setActionBarTitle(int resourceId) {
    setActionBarTitle(getResources().getString(resourceId);
}

यह आपको स्ट्रिंग स्ट्रिंग दोनों के साथ-साथ एक संसाधन आईडी जैसे कि R.id.this_is_a_stringआपके स्ट्रिंग्स.एक्सएमएल फ़ाइल से शीर्षक सेट करने की अनुमति देगा । यह थोड़ा और काम करेगा जैसे कि getSupportActionBar().setTitle()यह कैसे काम करता है क्योंकि यह आपको संसाधन आईडी में पारित करने की अनुमति देता है।


0

ऊपर उल्लिखित के रूप में कई तरीके हैं। तुम भी में यह कर सकते हैं onNavigationDrawerSelected()में अपनेDrawerActivity

public void setTitle(final String title){
    ((TextView)findViewById(R.id.toolbar_title)).setText(title);
}

@Override
public void onNavigationDrawerItemSelected(int position) {
    // update the main content by replacing fragments
    fragment = null;
    String title = null;
    switch(position){

    case 0:
        fragment = new HomeFragment();
        title = "Home";
        break;
    case 1:
        fragment = new ProfileFragment();
        title = ("Find Work");
        break;
    ...
    }
    if (fragment != null){

        FragmentManager fragmentManager = getFragmentManager();
        fragmentManager
        .beginTransaction()
        .replace(R.id.container,
                fragment).commit();

        //The key is this line
        if (title != null && findViewById(R.id.toolbar_title)!= null ) setTitle(title);
    }
}

0

कम से कम मेरे लिए, रनटाइम में एक टैब शीर्षक बदलने के लिए एक आसान जवाब था (बहुत खुदाई के बाद):

TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); tabLayout.getTabAt (MyTabPos) .setText ("मेरा नया पाठ");


0

यदि आप उपयोग कर रहे हैं ViewPager(मेरे मामले की तरह) तो आप उपयोग कर सकते हैं:

getSupportActionBar().setTitle(YOURE_TAB_BAR.getTabAt(position).getText());

में onPageSelectedकी विधि अपनेVIEW_PAGER.addOnPageChangeListener


0

आपकी मुख्यता में, के तहत onCreate:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

और अपनी खंड गतिविधि के तहत onResume:

getActivity().setTitle(R.string.app_name_science);

वैकल्पिक: - यदि वे अशक्त संदर्भ की चेतावनी दिखाते हैं

Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);


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