การตั้งค่าชื่อ ActionBar แบบกำหนดเองจาก Fragment


90

ใน Main ของ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ฉันต้องการให้ชื่อเปลี่ยน ฉันไม่แน่ใจว่าจะเข้าถึง Main ได้Activityอย่างไร? ที่ผ่านมาฉันทำสิ่งนี้:

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

มีใครสามารถแนะนำวิธีการที่เหมาะสมได้หรือไม่?

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ควรเป็นคำตอบที่ยอมรับได้เนื่องจากความสามารถในการปรับขนาดได้ เนื่องจากวิธีการอื่น ๆ ทั้งหมดกำลังสร้างส่วนที่เชื่อมโยงกับกิจกรรมเฉพาะซึ่งไม่ใช่การออกแบบที่ปรับขนาดได้จะเกิดอะไรขึ้นหากต้องใช้ส่วนเดียวกันกับหลายกิจกรรมนี่คือสิ่งที่กรอบงาน Android แนะนำเช่นกัน
Akhil Dad

คำตอบ:


98

=== อัปเดต 30 ตุลาคม 2562 ===

เนื่องจากเรามีส่วนประกอบใหม่ ๆ เช่นViewModelและLiveDataเราจึงมีวิธีที่แตกต่างและง่ายกว่าในการอัปเดต Activity Title จาก Fragment โดยใช้ ViewModel และ Live Data

กิจกรรม

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 เมษายน 2558 ===

คุณควรใช้ Listener เพื่ออัปเดตชื่อแถบการกระทำของคุณ

ส่วน:

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
นี่ควรเป็นคำตอบที่ได้รับการยอมรับ! มันแสดงให้เห็นอย่างถูกต้องว่าควรทำอย่างไร: หากแฟรกเมนต์ต้องการสื่อสารกับกิจกรรมการโฮสต์การสื่อสารควรเกิดขึ้นผ่านอินเทอร์เฟซเสมอ แฟรกเมนต์ให้อินเทอร์เฟซและกิจกรรมดำเนินการ! หากหลายส่วนต้องสื่อสารในลักษณะเดียวกันกับกิจกรรมให้เขียนส่วนนามธรรมซึ่งจัดเตรียมอินเทอร์เฟซแล้วปล่อยให้ทุกส่วนสืบทอดจาก "ส่วนฐาน" นี้
winklerrr

3
โดยวิธีนี้: เมธอด onAttach (กิจกรรม) ที่ใช้ในคำตอบนี้เลิกใช้งานแล้วในครั้งนี้ ตรวจสอบภายในonAttach(Context)วิธีการที่กิจกรรมโฮสต์ที่ส่งผ่านใช้อินเทอร์เฟซที่ต้องการ (ดึงข้อมูลกิจกรรมโฮสต์ผ่านcontext.getActivity())
winklerrr

2
หลายปีผ่านไปฉันเปลี่ยนเป็นคำตอบที่ยอมรับเพราะอย่างที่เราทราบกันดีว่าอินเทอร์เฟซเป็นวิธีที่ส่วนย่อยและกิจกรรมต่างๆจำเป็นต้องสื่อสาร
TheLettuceMaster

150

สิ่งที่คุณทำนั้นถูกต้อง Fragmentsไม่ได้มีการเข้าถึงActionBarAPIs getActivityเพื่อให้คุณมีการเรียกร้อง เว้นแต่คุณFragmentจะเป็นคลาสภายในแบบคงที่ซึ่งในกรณีนี้คุณควรสร้างWeakReferenceไปยังผู้ปกครองและเรียกใช้กิจกรรม getActionBarจากที่นั่น.

ในการตั้งชื่อของคุณActionBarในขณะที่ใช้รูปแบบที่กำหนดเองในของคุณคุณจะต้องโทรFragmentgetActivity().setTitle(YOUR_TITLE)

สาเหตุที่คุณโทรsetTitleเป็นเพราะคุณเรียกgetTitleชื่อActionBarไฟล์. getTitleส่งคืนชื่อสำหรับสิ่ง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และลบ "this" ของฉันด้วย ไม่มีการเปลี่ยนแปลง ... และไม่ใช่ไม่ใช่staticชั้นใน
TheLettuceMaster

รออะไรไม่ได้ผล? ใน OP ของคุณคุณไม่ได้กล่าวถึงสิ่งที่ไม่ได้ผลคุณเพียง แต่ต้องการทราบวิธีการ "ที่เหมาะสม" เพื่อตั้งชื่อในไฟล์ActionBarจากไฟล์Fragment. นอกจากนี้ฉันไม่ได้เสนอการลบthis.whateverเป็นวิธีแก้ปัญหา แต่อย่างใดนั่นเป็นเพียงเคล็ดลับการจัดรูปแบบโค้ดเท่านั้น
adneal

ฉันคิดว่าฉันเข้าใจสิ่งที่คุณประสบปัญหาและแก้ไขคำตอบของฉันตามนั้น
adneal

คำตอบที่สมบูรณ์แบบ Thankx
Ammar ali

@KickingLettuce ฉันต่อสู้กับคำตอบนี้มาระยะหนึ่งแล้วจนทำให้มันใช้งานได้ (นั่นคือเหตุผลที่ฉันโหวตขึ้นและคำถามของคุณ): ในกิจกรรมหลักของลิ้นชักการนำทาง ( menu_act) ฉันสร้าง "mTitle" ระดับโลกและใน ส่วนแรกที่ผมกำหนดชื่อใน "mTitle" ( ( (menu_act) getActivity() ).mTitle = "new_title") ( (menu_act) getActivity() ).restoreActionBar();และทันทีที่ฉันทำ ภายใน "restoreActionBar ()" ฉันมี "actionBar.setTitle (mTitle);"
Jose Manuel Abarca Rodríguez

29

ตัวอย่างของ Google มักจะใช้สิ่งนี้ภายในส่วนย่อย

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

แฟรกเมนต์จะเป็นของ ActionBarActivity และนั่นคือที่อ้างอิงไปยัง actionbar สิ่งนี้สะอาดกว่าเนื่องจากส่วนย่อยไม่จำเป็นต้องรู้ว่ามันคือกิจกรรมอะไรเพียง แต่ต้องเป็นของกิจกรรมที่ใช้ 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");
    }
}

ขอบคุณ. ทางออกที่ดีมากด้วยวิธีนี้คุณยังสามารถส่งผ่านมุมมองที่กำหนดเองไปยังแถบการกระทำของคุณ
Amir

ด้วยการอัปเดตล่าสุดบน Android SDK แทนที่จะเป็น ActionBarActivity คุณอาจต้องการดาวน์แคสต์เป็น AppCompatActivity ในกรณีที่คุณใช้ไลบรารีความเข้ากันได้แบบย้อนหลัง v7 (ซึ่งคุณควรจะเป็น)
fr4gus

8

การตั้งActivityชื่อเรื่องจากFragmentระดับความรับผิดชอบที่ยุ่งเหยิง Fragmentอยู่ภายใน an Activityดังนั้นนี่คือสิ่งActivityที่ควรตั้งชื่อเรื่องของตัวเองตามประเภทของFragmentตัวอย่าง

สมมติว่าคุณมีอินเทอร์เฟซ:

interface TopLevelFragment
{
    String getTitle();
}

Fragments ซึ่งจะมีผลต่อActivity's ชื่อแล้วใช้อินเตอร์เฟซนี้ ขณะอยู่ในกิจกรรมการโฮสต์คุณเขียน:

@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

ใน Fragment เราสามารถใช้แบบนี้ได้มันใช้งานได้ดีสำหรับฉัน

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

สิ่งนี้ใช้ไม่ได้เมื่อแถบเครื่องมือของกิจกรรมของเรามี TextView ที่มีบทบาทของชื่อ
Simon

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")ประสบความสำเร็จ ใน Kotlin activity!!.title = "titleชิ้นส่วนของฉันไม่
Joe Lapp

2

ใช้สิ่งต่อไปนี้:

getActivity().setTitle("YOUR_TITLE");

คำตอบนี้คือการเปลี่ยนชื่อของกิจกรรมคำถามเกี่ยวกับชื่อของ ActionBar แทน
David d C e Freitas

ขอบคุณ @Anisetti! นั่นเป็นเพียงสิ่งที่ฉันทำในคลาส Fragment
Francis Rodrigues

2

นี่คือวิธีแก้ปัญหาของฉันสำหรับการตั้งค่าชื่อ ActionBar จากแฟรกเมนต์เมื่อใช้ NavigationDrawer โซลูชันนี้ใช้อินเทอร์เฟซดังนั้นแฟรกเมนต์จึงไม่จำเป็นต้องอ้างอิงกิจกรรมหลักโดยตรง:

1) สร้างอินเทอร์เฟซ:

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

2) ในonAttachของ Fragment ให้ส่งกิจกรรมไปยังประเภท Interface และเรียกใช้เมธอด 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; 
}

นี้ควรจะเป็นคำตอบที่ได้รับการยอมรับเพราะวิธีการอื่น ๆ ทั้งหมดจะทำให้ส่วนเชื่อมโยงกับกิจกรรมโดยเฉพาะอย่างยิ่งที่ไม่ได้มีการออกแบบที่สามารถปรับขนาดได้ยังนี้คือสิ่งที่กรอบหุ่นยนต์ยังแนะนำ
Akhil พ่อ

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

สมมติว่าผู้เล่นระดับประถมเหล่านี้ตรงหรือเป็นเวอร์ชันที่สูงกว่าในโครงการของคุณ:

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

หากคุณมีกิจกรรมหลักที่มีชิ้นส่วนจำนวนมากที่คุณใส่ไว้โดยปกติจะใช้ navigationDrawer และคุณมีอาร์เรย์ของชื่อเรื่องสำหรับชิ้นส่วนของคุณเมื่อคุณกดย้อนกลับเพื่อให้พวกเขาเปลี่ยนใส่สิ่งนี้ในการแสดงหลักที่เก็บเศษชิ้นส่วนไว้

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

}

สิ่งนี้จะถือว่าสำหรับแต่ละส่วนคุณให้แท็กซึ่งโดยปกติจะอยู่ที่ใดที่หนึ่งเมื่อคุณเพิ่มส่วนในรายการ navigationDrawer ตามตำแหน่งที่กดในรายการ ตำแหน่งนั้นคือสิ่งที่ฉันจับได้บนแท็ก:

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

ตอนนี้ navMenuTitles คือสิ่งที่คุณโหลดบน onCreate

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

อาร์เรย์ xml เป็นทรัพยากรสตริงประเภทอาร์เรย์บน strings.xml

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

1

บันทึกคำตอบของคุณในวัตถุ String [] และตั้งค่า OnTabChange () ใน MainActivity เป็น 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

ข้อเสียของวิธีการคัดเลือกนักแสดงเช่นนั้น

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

คือแฟรกเมนต์ของคุณไม่สามารถใช้ซ้ำได้อีกต่อไปนอก MainActivityFragment หากคุณไม่ได้วางแผนที่จะใช้นอกกิจกรรมนั้นก็ไม่มีปัญหา แนวทางที่ดีกว่าคือการตั้งชื่อตามเงื่อนไขขึ้นอยู่กับกิจกรรม ดังนั้นในส่วนของคุณคุณจะต้องเขียน:

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

1

หากคุณใช้เทมเพลตที่เสถียรของ android studio 1.4 ที่ Google จัดหาให้มากกว่าง่ายๆคุณต้องเขียนโค้ดต่อไปนี้ในonNavigationItemSelectedmethode ซึ่งแฟรกเมนต์ที่เกี่ยวข้องของคุณเรียกใช้ if condition

 setTitle("YOUR FRAGMENT TITLE");

เป็นเรื่องที่ยอดเยี่ยมถ้าคุณสามารถเข้าถึงชื่อได้โดยตรงจากกิจกรรม ... แต่ถ้าชื่อเป็นสตริงที่ตั้งค่าแบบไดนามิกในส่วนจะต้องมีการสื่อสารระหว่างส่วนและกิจกรรม
me_

1

ฉันได้รับวิธีง่ายๆในการตั้งค่า ActionBar Title ในส่วนย่อยหรือกิจกรรมใด ๆ โดยไม่ต้องปวดหัว

เพียงแก้ไข xml ที่กำหนด Toolbar ดังต่อไปนี้:

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

ยอดเยี่ยม! การใช้ toolbar_title จะแทนที่หัวเรื่องแฟรกเมนต์หากใช้ Android Navigation Components
Paixols

0

หากต้องการเพิ่มคำตอบที่เลือกคุณอาจต้องการเพิ่มวิธีที่สองในกิจกรรมหลักของคุณ ดังนั้นคุณจะจบลงด้วยวิธีการต่อไปนี้ในกิจกรรมหลักของคุณ:

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

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

สิ่งนี้จะช่วยให้คุณตั้งหัวเรื่องจากทั้งตัวแปร String และ ID ทรัพยากรเช่นR.id.this_is_a_stringจากไฟล์ strings.xml ของคุณ วิธีนี้จะทำงานได้ดีขึ้นเล็กน้อยเช่นกัน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

ใน MainActivity ของคุณภายใต้ 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);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.