首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从片段设置自定义ActionBar标题

从片段设置自定义ActionBar标题
EN

Stack Overflow用户
提问于 2013-03-22 08:54:42
回答 22查看 170.4K关注 0票数 96

在我的主FragmentActivity中,我这样设置我的自定义ActionBar标题:

代码语言:javascript
复制
    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来做到这一点?在过去,我这样做:

代码语言:javascript
复制
((MainFragmentActivity) getActivity()).getSupportActionBar().setTitle(
            catTitle);

有人能建议一下正确的方法吗?

XML:

代码语言:javascript
复制
<?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>
EN

回答 22

Stack Overflow用户

回答已采纳

发布于 2013-08-02 15:56:58

===Update 10月,30岁,2019===

由于我们有了 ViewModel LiveData等新组件,因此我们可以使用ViewModel和动态数据以不同/更简单的方式从片段更新活动标题

活动

代码语言:javascript
复制
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

代码语言:javascript
复制
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:

代码语言:javascript
复制
class MainViewModel : ViewModel() {
private val _title = MutableLiveData<String>()
val title: LiveData<String>
get() = _title
fun updateActionBarTitle(title: String) = _title.postValue(title) }

然后,您可以使用viewModel.updateActionBarTitle("Custom Title From Fragment")从片段更新活动标题

===Update 4月,10岁,2015===

您应该使用侦听器来更新操作栏标题

片段:

代码语言:javascript
复制
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);
    }
}

和活动:

代码语言:javascript
复制
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

票数 104
EN

Stack Overflow用户

发布于 2013-03-22 09:09:12

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

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

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

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

Activity中的

代码语言:javascript
复制
public void setActionBarTitle(String title){
    YOUR_CUSTOM_ACTION_BAR_TITLE.setText(title);
}

片段中的

代码语言:javascript
复制
((MainFragmentActivity) getActivity()).setActionBarTitle(YOUR_TITLE);

文档:

Activity.getTitle

Activity.setTitle

而且,您不需要在所提供的代码中调用this.whatever,只需提示即可。

票数 151
EN

Stack Overflow用户

发布于 2014-03-06 02:00:22

Google示例倾向于在片段中使用这一点。

代码语言:javascript
复制
private ActionBar getActionBar() {
    return ((ActionBarActivity) getActivity()).getSupportActionBar();
}

该片段将属于一个ActionBarActivity,这就是对actionbar的引用所在的位置。这更清晰,因为片段不需要确切知道它是什么活动,它只需要属于实现ActionBarActivity的活动。这使得片段更加灵活,并且可以像预期的那样添加到多个活动中。

现在,您需要在片段中所做的就是。

代码语言:javascript
复制
getActionBar().setTitle("Your Title");

如果您的片段继承自一个基本片段,而不是普通的片段类,那么这种方法效果很好。

代码语言:javascript
复制
public abstract class BaseFragment extends Fragment {
    public ActionBar getActionBar() {
        return ((ActionBarActivity) getActivity()).getSupportActionBar();
    }
}

然后在你的片段中。

代码语言:javascript
复制
public class YourFragment extends BaseFragment {
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        getActionBar().setTitle("Your Title");
    }
}
票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15560904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档