从片段设置自定义动作条标题(Setting Custom ActionBar Title from

2019-07-22 13:01发布

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

Answer 1:

在您的活动:

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

}

===更新四月,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



Answer 2:

你在做什么是正确的。 Fragments没有进入到ActionBar的API,所以你必须调用getActivity 。 除非你的Fragment是一个静态内部类,在这种情况下,你应该创建一个WeakReference父和呼叫活动。 getActionBar从那里。

设置标题为你的ActionBar ,同时采用了自定义布局,在你的Fragment ,你需要调用getActivity().setTitle(YOUR_TITLE)

您呼叫的原因setTitle是因为你所呼叫getTitle作为您的标题ActionBargetTitle返回标题为Activity

如果你不想让打电话getTitle ,那么你就需要创建一个设置你的文字的公共方法TextViewActivity承载Fragment

在您的活动

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

在您的片段

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

文档:

Activity.getTitle

Activity.setTitle

此外,你不需要调用this.whatever在你提供的代码,只是一个提示。



Answer 3:

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

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


Answer 4:

设置Activity的从标题Fragment打乱了责任水平。 Fragment包含在一个内Activity ,所以这是Activity ,这应根据的类型来设置其自己的标题Fragment例如。

假设你有一个接口:

interface TopLevelFragment
{
    String getTitle();
}

Fragment可以影响的S 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 s的结合,这是非常有可能在平板电脑上。



Answer 5:

在我们可以用这样的片段,它的工作对我罚款。

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


Answer 6:

以防万一,如果您有代码的问题,可以尝试在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");
 }


Answer 7:

使用以下命令:

getActivity().setTitle("YOUR_TITLE");


Answer 8:

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

工具栏

使用延伸

AppCompatActivity

,从它被称为片段可以使用下面提及的代码用于改变标题。

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


Answer 9:

如果你有很多片段主要活动你放,通常使用navigationDrawer。 你有标题为你片段的阵列,当您按下回来,为他们改变,把这个持有的片段主要actity

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


Answer 10:

保存乌尔回答在字符串[]对象和在MainActivity设置OnTabChange()作为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));
}


Answer 11:

这是我从片段,设定动作条标题中使用NavigationDrawer时的解决方案。 此解决方案使用接口,以便所述片段不需要直接引用的父活动:

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


Answer 12:

缺点你铸像这样的方法

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

是你的片段不再MainActivityFragment的可重复使用的外面。 如果你不打算使用它该活动之外,那么就没有问题。 更好的办法是有条件地设置根据活动的称号。 所以,你的片段里,你可以这样写:

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


Answer 13:

如果您使用的是Android的工作室由谷歌不是简单的提供1.4稳定模板,你必须写下面的代码在onNavigationItemSelected梅索德在您的相关片段调用if条件。

 setTitle("YOUR FRAGMENT TITLE");


Answer 14:

我得到一个非常简单的解决方案来动作条标题中碎裂或没有任何头痛的任何活动。

只要修改其中定义工具栏下面的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");


Answer 15:

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

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

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

这将允许您设置,无论从字符串变量标题,以及作为资源ID,如R.id.this_is_a_string从您的strings.xml文件。 这也将工作更像是如何一点点getSupportActionBar().setTitle()的作品,因为它可以让你在一个资源ID传递。



Answer 16:

有很多方法如上面所述。 你也可以做到这一点在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);
    }
}


Answer 17:

至少对我来说,有一个简单的答案(多后周围挖)在运行时改变分页标题:

TabLayout tabLayout =(TabLayout)findViewById(R.id.tabs); tabLayout.getTabAt(MyTabPos).setText( “我的新文本”);



Answer 18:

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

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

onPageSelected你的方法VIEW_PAGER.addOnPageChangeListener



Answer 19:

为改变标题最佳活动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);
}


文章来源: Setting Custom ActionBar Title from Fragment