在我的主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>
发布于 2013-08-02 15:56:58
===Update 10月,30岁,2019===
由于我们有了 ViewModel 和LiveData等新组件,因此我们可以使用ViewModel和动态数据以不同/更简单的方式从片段更新活动标题
活动
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) }
然后,您可以使用viewModel.updateActionBarTitle("Custom Title From Fragment")
从片段更新活动标题
===Update 4月,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
发布于 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
,那么您需要创建一个公共方法,用于在托管TextView
的Activity
中设置Fragment
的文本。
Activity中的
public void setActionBarTitle(String title){
YOUR_CUSTOM_ACTION_BAR_TITLE.setText(title);
}
片段中的
((MainFragmentActivity) getActivity()).setActionBarTitle(YOUR_TITLE);
文档:
而且,您不需要在所提供的代码中调用this.whatever
,只需提示即可。
发布于 2014-03-06 02:00:22
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");
}
}
https://stackoverflow.com/questions/15560904
复制相似问题