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




android toolbar title center (12)

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

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总是可以控制使用什么标题,这在平板电脑上非常有可能。


你在做什么是正确的。 Fragments无法访问ActionBar API,因此您必须调用getActivity 。 除非你的Fragment是一个静态的内部类,在这种情况下,你应该为父对象创建一个WeakReference并且调用Activity。 getActionBar从那里。

要使用自定义布局设置ActionBar的标题,在您的Fragment您需要调用getActivity().setTitle(YOUR_TITLE)

你调用setTitle的原因是因为你调用getTitle作为你的ActionBar的标题。 getTitle返回该Activity的标题。

如果您不想调用getTitle ,那么您需要创建一个公共方法,在托管FragmentActivity中设置TextView的文本。

在你的活动中

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

在你的片段中

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

文档:

Activity.getTitle

Activity.setTitle

另外,您不需要调用this.whatever你提供的代码是什么,只是一个提示。


使用以下内容:

getActivity().setTitle("YOUR_TITLE");

保存你在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));
}

在你的活动中:

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

在你的片段中:

public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    // Set title bar
    ((MainFragmentActivity) getActivity())
            .setActionBarTitle("Your title");

}

===更新2015年4月10日===

您应该使用监听器更新您的操作栏标题

分段:

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.htmlhttps://developer.android.com/training/basics/fragments/communicating.html


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

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

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

 setTitle("YOUR FRAGMENT TITLE");

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

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

onPageSelected方法中


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

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

工具栏

被扩展使用

AppCompatActivity

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

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

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

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


谷歌的例子倾向于在片段中使用它。

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

该片段将属于一个ActionBarActivity,并且这是对操作栏的引用。 这更清晰,因为片段不需要确切知道它是什么活动,它只需要属于实现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");
    }
}




android-fragmentactivity