Đặt tiêu đề thanh hành động tùy chỉnh từ phân mảnh


90

Trong Chính của tôi FragmentActivity, tôi thiết lập ActionBartiêu đề tùy chỉnh của mình như sau:

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

Điều này hoạt động hoàn hảo. Tuy nhiên, một khi tôi mở khác Fragments, tôi muốn tiêu đề thay đổi. Tôi không biết làm thế nào để truy cập vào Main Activityđể thực hiện việc này? Trong quá khứ, tôi đã làm điều này:

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

Ai đó có thể tư vấn về phương pháp thích hợp?

XML:

<?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 nên là câu trả lời được chấp nhận vì khả năng mở rộng của nó. bởi vì tất cả các cách tiếp cận khác đang làm cho phân đoạn bị ràng buộc với hoạt động cụ thể, đây không phải là một thiết kế có thể mở rộng, điều gì sẽ xảy ra nếu cùng một phân đoạn phải được sử dụng với nhiều hoạt động, đây cũng là điều mà android framework cũng khuyến nghị.
Akhil Dad

Câu trả lời:


98

=== Cập nhật ngày 30 tháng 10 năm 2019 ===

Vì chúng tôi có các thành phần mới như ViewModelLiveData , chúng tôi có thể có một cách khác / dễ dàng hơn để cập nhật Tiêu đề hoạt động từ Fragment bằng cách sử dụng ViewModel và Dữ liệu trực tiếp

Hoạt động

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

Và MainModelView:

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

Và sau đó, bạn có thể cập nhật tiêu đề Hoạt động từ Fragment bằng cách sử dụng viewModel.updateActionBarTitle("Custom Title From Fragment")

=== Cập nhật ngày 10 tháng 4 năm 2015 ===

Bạn nên sử dụng trình nghe để cập nhật tiêu đề thanh tác vụ của mình

Miếng:

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

Và Hoạt động:

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

Đọc thêm tại đây: https://developer.android.com/training/basics/fragment/communicating.html


1
Nó đã làm việc cho tôi! Tôi vừa sử dụng getActionBar (). SetTitle (title) thay thế trong hoạt động. Cảm ơn
luckyreed76

1
Chính xác những gì tôi đang tìm kiếm- hoạt động tốt hơn cho tôi so với câu trả lời đã chọn. Cảm ơn!
dstrube

1
Đây phải là câu trả lời được chấp nhận! Nó chỉ ra một cách chính xác cách nó phải được thực hiện: Nếu một phân mảnh muốn giao tiếp với hoạt động lưu trữ của nó, thì giao tiếp phải luôn diễn ra thông qua một giao diện. Phân mảnh cung cấp giao diện và hoạt động thực hiện nó! Nếu nhiều phân đoạn phải giao tiếp theo cùng một cách với một hoạt động, hãy viết một phân đoạn trừu tượng cung cấp giao diện và sau đó để mọi phân đoạn kế thừa từ "phân đoạn cơ sở" này.
winklerrr

3
Nhân tiện: Phương thức onAttach (Hoạt động) được sử dụng trong câu trả lời này hiện không được dùng nữa. Kiểm tra bên trong onAttach(Context)phương pháp làm ướt hoạt động máy chủ lưu trữ đã thông qua triển khai giao diện cần thiết (truy xuất hoạt động máy chủ lưu trữ thông qua context.getActivity()).
winklerrr

2
Sau nhiều năm, tôi đã thay đổi câu trả lời này thành câu trả lời được chấp nhận bởi vì như chúng ta biết, giao diện là cách các mảnh và hoạt động cần giao tiếp.
TheLet MobileMaster

150

Những gì bạn đang làm là chính xác. Fragmentskhông có quyền truy cập vào các ActionBarAPI, vì vậy bạn phải gọi getActivity. Trừ khi của bạn Fragmentlà một lớp bên trong tĩnh, trong trường hợp đó, bạn nên tạo một WeakReferencelớp cha và gọi Activity. getActionBartừ đó.

Để đặt tiêu đề cho của bạn ActionBar, trong khi sử dụng bố cục tùy chỉnh, Fragmentbạn cần phải gọi getActivity().setTitle(YOUR_TITLE).

Lý do bạn gọi setTitlelà vì bạn đang gọi getTitlelà tiêu đề của bạn ActionBar. getTitletrả lại tiêu đề cho điều đó Activity.

Nếu bạn không muốn nhận cuộc gọi getTitle, thì bạn sẽ cần tạo một phương thức công khai đặt văn bản của bạn TextViewtrong Activitymáy chủ lưu trữ Fragment.

Trong Hoạt động của bạn :

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

Trong Fragment của bạn :

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

Tài liệu:

Activity.getTitle

Activity.setTitle

Ngoài ra, bạn không cần phải gọi this.whatevertheo mã bạn đã cung cấp, chỉ cần một mẹo.


Tôi cố gắng và tôi không thể làm cho nó hoạt động. Đối với những gì giá trị của nó, tôi đã đăng của tôi XMLvà cũng xóa "này". Không thay đổi ... Và không, nó không phải là staticlớp bên trong.
TheLettuceMaster

Chờ đã, những gì không hoạt động? Trong OP của bạn, bạn không đề cập đến bất cứ điều gì không hoạt động, bạn chỉ đề cập đến việc muốn biết phương pháp "thích hợp" để đặt tiêu đề trong ActionBartừ a Fragment. Ngoài ra, tôi không đề nghị loại bỏ this.whatevernhư một giải pháp cho bất cứ điều gì, đó chỉ là một mẹo định dạng mã.
adneal

Tôi nghĩ rằng tôi hiểu bạn đang gặp khó khăn gì và đã chỉnh sửa câu trả lời của tôi cho phù hợp.
adneal

Thankx câu trả lời hoàn hảo
Ammar ali

@KickingLet Mobile, tôi đấu tranh với câu trả lời này trong một thời gian cho đến khi tôi làm cho nó hoạt động (đó là lý do tại sao tôi ủng hộ nó, cũng như câu hỏi của bạn): trong hoạt động chính ngăn điều hướng của tôi ( menu_act), tôi đã tạo "mTitle" toàn cầu và, trong một , đầu tiên tôi gán một tiêu đề cho "mTitle" ( ( (menu_act) getActivity() ).mTitle = "new_title") và ngay lập tức tôi thực hiện ( (menu_act) getActivity() ).restoreActionBar();. Bên trong "restoreActionBar ()", tôi có "actionBar.setTitle (mTitle);".
Jose Manuel Abarca Rodríguez

29

Các ví dụ của Google có xu hướng sử dụng điều này trong các phân đoạn.

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

Đoạn sẽ thuộc về ActionBarActivity và đó là nơi chứa tham chiếu đến thanh tác vụ. Điều này rõ ràng hơn vì phân mảnh không cần biết chính xác hoạt động đó là gì, nó chỉ cần thuộc về một hoạt động triển khai ActionBarActivity. Điều này làm cho phân mảnh linh hoạt hơn và có thể được thêm vào nhiều hoạt động giống như chúng được thiết kế.

Bây giờ, tất cả những gì bạn cần làm trong phân mảnh là.

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

Điều này hoạt động tốt nếu bạn có một phân đoạn cơ sở mà các phân đoạn của bạn kế thừa thay vì lớp phân mảnh bình thường.

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

Sau đó, trong phân đoạn của bạn.

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

Cảm ơn. giải pháp rất hay, bằng cách này, bạn cũng có thể chuyển chế độ xem tùy chỉnh vào thanh tác vụ của mình.
Amir

Với các bản cập nhật gần đây trên Android SDK, thay vì ActionBarActivity, bạn có thể muốn truyền xuống AppCompatActivity trong trường hợp bạn đang sử dụng thư viện tương thích ngược v7 (có thể bạn nên làm như vậy).
fr4gus

8

Đặt Activitytiêu đề từ một Fragmentmức độ trách nhiệm lộn xộn. Fragmentđược chứa trong một Activity, vì vậy đây là Activity, nên đặt tiêu đề riêng của nó theo kiểu của Fragmentví dụ.

Giả sử bạn có một giao diện:

interface TopLevelFragment
{
    String getTitle();
}

Cái Fragmentnào có thể ảnh hưởng đến Activitytiêu đề của thì triển khai giao diện này. Trong khi hoạt động lưu trữ, bạn viết:

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

Theo cách Activitynày, bạn luôn kiểm soát được việc sử dụng tiêu đề nào, ngay cả khi nhiều chữ TopLevelFragmentđược kết hợp với nhau, điều này hoàn toàn có thể xảy ra trên máy tính bảng.


6

Tôi không nghĩ rằng câu trả lời được chấp nhận là một câu trả lời hoàn hảo cho nó. Vì tất cả các hoạt động sử dụng

Thanh công cụ

được mở rộng sử dụng

AppCompatActivity

, các đoạn được gọi từ nó có thể sử dụng mã được đề cập bên dưới để thay đổi tiêu đề.

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

5

Trong Fragment, chúng ta có thể sử dụng như thế này, Nó hoạt động tốt đối với tôi.

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

Đây không hoạt động khi Thanh công cụ của hoạt động của chúng tôi có một TextView có vai trò của tiêu đề
Simon

4

Chỉ trong trường hợp nếu bạn đang gặp vấn đề với mã, hãy thử đặt getSupportActionBar().setTitle(title)bên trong onResume()của mảnh của bạn thay vì onCreateView(...)tức

Trong MainActivity.java :

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

Trong mảnh:

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

Đây là vấn đề của tôi - nơi tôi đã đặt tiêu đề. Tuy nhiên, ((MainActivity) getActivity()).setTitle("title")đủ. Trong Kotlin, mảnh vỡ của tôi có activity!!.title = "title.
Joe Lapp

2

Sử dụng như sau:

getActivity().setTitle("YOUR_TITLE");

Câu trả lời này là thay đổi tiêu đề của Hoạt động, câu hỏi là về tiêu đề của ActionBar thay thế.
David d C e Freitas

Cảm ơn @Anisetti! Đó chỉ là những gì tôi đã làm trong lớp Fragment.
Francis Rodrigues

2

Đây là giải pháp của tôi để đặt tiêu đề ActionBar từ các phân đoạn, khi sử dụng NavigationDrawer. Giải pháp này sử dụng Giao diện nên các phân đoạn không cần tham chiếu trực tiếp đến Hoạt động mẹ:

1) Tạo giao diện:

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

2) Trong onAttach của Fragment , truyền hoạt động sang kiểu Giao diện và gọi phương thức SetActivityTitle:

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

3) Trong hoạt động, triển khai giao diện ActionBarTitleSetter :

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

Đây phải là câu trả lời được chấp nhận vì tất cả các phương pháp tiếp cận khác đang làm cho phân đoạn bị ràng buộc với hoạt động cụ thể, đây không phải là một thiết kế có thể mở rộng, đây cũng là điều mà khuôn khổ Android cũng khuyến nghị
Akhil Dad

2

Sự kiện tốt nhất để thay đổi tiêu đề 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

Một ví dụ Kotlin đơn giản

Giả sử các gradle deps này khớp hoặc là phiên bản cao hơn trong dự án của bạn:

kotlin_version = '1.3.41'
nav_version_ktx = '2.0.0'

Điều chỉnh điều này cho các lớp phân mảnh của bạn:

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

Nếu bạn có một hoạt động chính với nhiều đoạn bạn đưa vào, thường sử dụng navigationDrawer. Và bạn có một loạt tiêu đề cho các phân đoạn của mình, khi bạn nhấn lại, để chúng thay đổi, hãy đặt tiêu đề này vào hoạt động chính giữ các phân đoạn

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

}

Điều này giả định rằng đối với mỗi phân đoạn bạn cung cấp cho nó một thẻ, thường là ở đâu đó khi bạn thêm các đoạn vào danh sách navigationDrawer, theo vị trí được nhấn trên danh sách. Vì vậy, vị trí đó là những gì tôi nắm bắt trên thẻ:

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

Bây giờ, navMenuTitles là thứ bạn tải trên onCreate

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

Mảng xml là một tài nguyên chuỗi kiểu mảng trên string.xml

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

1

Lưu Câu trả lời của bạn trong đối tượng String [] và đặt nó là OnTabChange () trong MainActivity dưới dạng Belowwww

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

Nhược điểm của cách tiếp cận của bạn để truyền như vậy

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

là phân đoạn của bạn không thể sử dụng lại được nữa bên ngoài MainActivityFragment. Nếu bạn không định sử dụng nó ngoài hoạt động đó, thì không có vấn đề gì. Một cách tiếp cận tốt hơn sẽ là đặt tiêu đề có điều kiện tùy thuộc vào hoạt động. Vì vậy, bên trong phân đoạn của bạn, bạn sẽ viết:

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

1

nếu bạn đang sử dụng mẫu ổn định android studio 1.4 do google cung cấp thì đơn giản hơn bạn phải viết mã sau đây bằng onNavigationItemSelectedmethode trong đó điều kiện gọi phân đoạn liên quan của bạn.

 setTitle("YOUR FRAGMENT TITLE");

đó là tuyệt vời nếu bạn có quyền truy cập vào các tiêu đề trực tiếp từ hoạt động ... nhưng nếu tiêu đề là một chuỗi động thiết lập trong đoạn cần có thông tin liên lạc giữa các đoạn và hoạt động
me_

1

Tôi đang nhận được một giải pháp rất đơn giản để đặt Tiêu đề ActionBar trong phân đoạn hoặc bất kỳ hoạt động nào mà không phải đau đầu.

Chỉ cần sửa đổi xml nơi Thanh công cụ được xác định như bên dưới:

<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) Nếu bạn muốn đặt thanh tác vụ trong một phân đoạn thì:

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

Để sử dụng nó từ mọi nơi, bạn có thể xác định một phương pháp trong hoạt động

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

Để gọi phương thức này trong hoạt động, chỉ cần gọi nó.

setActionBarTitle("Your Title")

Để gọi phương thức này từ phân đoạn của hoạt động, chỉ cần gọi nó.

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

Thông minh! Việc sử dụng toolbar_title sẽ ghi đè tiêu đề phân đoạn nếu sử dụng Thành phần điều hướng của Android.
Paixols

0

Chỉ để thêm vào câu trả lời đã chọn, bạn cũng có thể muốn thêm phương pháp thứ hai vào hoạt động chính của mình. Vì vậy, bạn sẽ kết thúc với các phương pháp sau trong hoạt động chính của mình:

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

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

Điều này sẽ cho phép bạn đặt tiêu đề từ cả biến Chuỗi cũng như ID tài nguyên, chẳng hạn như R.id.this_is_a_stringtừ tệp string.xml của bạn. Điều này cũng sẽ hoạt động giống như cách getSupportActionBar().setTitle()hoạt động vì nó cho phép bạn chuyển vào một ID tài nguyên.


0

Có nhiều cách như đã nêu ở trên. Bạn cũng có thể làm điều này trong onNavigationDrawerSelected()trong của bạnDrawerActivity

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

Ít nhất đối với tôi, có một câu trả lời dễ dàng (sau khi tìm hiểu kỹ) để thay đổi tiêu đề tab trong thời gian chạy:

TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); tabLayout.getTabAt (MyTabPos) .setText ("Văn bản Mới của Tôi");


0

Nếu bạn đang sử dụng ViewPager(như trường hợp của tôi), bạn có thể sử dụng:

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

trong onPageSelectedphương pháp của bạnVIEW_PAGER.addOnPageChangeListener


0

Trong MainActivity của bạn, dưới onCreate:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

Và trong hoạt động phân mảnh của bạn dưới onResume:

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

Tùy chọn: - nếu chúng hiển thị cảnh báo về tham chiếu rỗng

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


Objects.requireNonNull(getActivity()).setTitle(R.string.app_name_science);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.