android toolbar标题居中 - 从片段设置自定义ActionBar标题



title center (16)

保存你在String []对象中的答案,并在MainActivity中将它设置为OnTabChange(),如下所示

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

在我的主要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:

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

如果你使用android提供的稳定模板比谷歌简单,你必须在onNavigationItemSelected方法中编写下面的代码,其中你的相关片段调用条件。

 setTitle("YOUR FRAGMENT TITLE");

使用以下内容:

getActivity().setTitle("YOUR_TITLE");

我不认为接受的答案是完美的答案。 由于所有使用的活动

工具栏

被扩展使用

AppCompatActivity

,从它调用的片段可以使用下面提到的代码来改变标题。

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

你的铸造方式的缺点就像这样

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

是你的片段不再可以在MainActivityFragment之外重用。 如果你不打算在该活动之外使用它,那么这没有问题。 更好的方法是根据活动有条件地设置标题。 所以在你的片段中,你会写:

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

这里是我使用NavigationDrawer时从片段设置ActionBar标题的解决方案。 该解决方案使用接口,因此片段不需要直接引用父Activity:

1)创建一个接口:

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

2)在片段的onAttach中 ,将活动转换为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; 
}

Fragment设置Activity的标题会扰乱责任级别。 Fragment包含在一个Activity ,所以这就是Activity ,它应该根据Fragment的类型设置自己的标题。

假设你有一个接口:

interface TopLevelFragment
{
    String getTitle();
}

可以影响Activity标题的Fragment可以实现这个界面。 在你写的托管活动中:

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

通过这种方式,即使合并了几个TopLevelFragmentActivity总是可以控制使用什么标题,这在平板电脑上非常有可能。


如果您遇到代码问题,请尝试将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");
 }

在片段中我们可以像这样使用,它对我来说工作得很好。

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

最好的活动更改标题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);
}

只要添加到选定的答案,您可能还想要添加第二种方法到您的主要活动。 所以你最终会在主要活动中使用以下方法:

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

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

这将允许您从R.id.this_is_a_string文件中设置来自String变量以及资源ID(例如R.id.this_is_a_string 。 这也会更像getSupportActionBar().setTitle()工作方式,因为它允许您传入资源ID。


至少对我而言,在运行时更改标签标题有一个简单的答案(经过深入挖掘):

TabLayout tabLayout =(TabLayout)findViewById(R.id.tabs); tabLayout.getTabAt(MyTabPos).setText(“My New Text”);


如上所述,有很多方法。 您也可以在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);
    }
}

如果您的主要活动是放入很多片段,通常使用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>

如果您使用ViewPager (如我的情况),您可以使用:

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

onPageSelected方法中


这是完整代码的样子。 请注意android.view.Window的导入。

package com.hoshan.tarik.test;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;

public class MainActivity extends Activity {

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




android android-fragments android-actionbar android-fragmentactivity