我一直在使用AppCompatv7 lib中的最新工具栏。我在ToolBar ViewGroup中放置了一个textview我想从我的activity中的片段中为这个Textview设置一个标题。如果是自定义操作栏((ActionBarActivity) )getActivity).setcustomView(..)本来可以完成这项工作。但由于使用了这个ToolBar,我无法使用它。我也在我的BaseActivity中实现了一个由所有Activities继承的方法。这个BaseActivity包含了我的初始化左侧滑动抽屉的方法。我必须在活动中初始化initDrawerLayout()方法,否则抽屉不会被初始化。如果我在片段中初始化它,它给我所有空的结果,既没有抽屉的切换按钮也没有自定义标题也没有设置。
这是我的initDrawer代码..
public void initDrawerLayout(String toolbar_text) {
mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
mDrawerRelative = (RelativeLayout) findViewById(R.id.drawer_relative);
if (mDrawerLayout != null) {
findViewById(R.id.drawer_btn_a).setOnClickListener(this);
findViewById(R.id.drawer_btn_b).setOnClickListener(this);
findViewById(R.id.drawer_btn_c).setOnClickListener(this);
findViewById(R.id.drawer_btn_d).setOnClickListener(this);
findViewById(R.id.drawer_btn_e).setOnClickListener(this);
findViewById(R.id.drawer_btn_f).setOnClickListener(this);
findViewById(R.id.drawer_btn_g).setOnClickListener(this);
findViewById(R.id.drawer_btn_h).setOnClickListener(this);
findViewById(R.id.drawer_btn_i).setOnClickListener(this);
findViewById(R.id.drawer_btn_j).setOnClickListener(this);
findViewById(R.id.drawer_btn_k).setOnClickListener(this);
findViewById(R.id.drawer_btn_l).setOnClickListener(this);
findViewById(R.id.my_layout).setOnClickListener(this);
Toolbar toolbar = (Toolbar) findViewById(R.id.my_awesome_toolbar);
toolbar.setBackground(getResources().getDrawable(R.drawable.icn_actionbar_background));
TextView mTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
mTitle.setText(toolbar_text);
mTitle.setTypeface(Typeface.DEFAULT_BOLD);
if (toolbar != null) {
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
toolbar.setNavigationIcon(R.drawable.ic_drawer);
mDrawerToggle = new ActionBarDrawerToggle(
this, mDrawerLayout, toolbar,
R.string.drawer_open, R.string.drawer_close
);
mDrawerLayout.setDrawerListener(mDrawerToggle);
toolbar.setNavigationOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (mDrawerLayout.isDrawerOpen(Gravity.LEFT)) {
mDrawerLayout.closeDrawer(Gravity.LEFT);
} else {
mDrawerLayout.openDrawer(Gravity.LEFT);
}
}
});
mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
GravityCompat.START);
mDrawerLayout.setScrimColor(getResources().getColor(
android.R.color.transparent));
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setHomeButtonEnabled(true);
getSupportActionBar().setDisplayShowTitleEnabled(false);
}
}
这是片段中的代码..
((FirstActivity) getActivity()).initDrawerLayout(mFirst.name);
其中mFirst是Person类的对象
和工具栏代码..
<android.support.v7.widget.Toolbar
android:id="@+id/my_awesome_toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize">
<TextView
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:text="Toolbar Title"
android:textColor="@color/action_text-color"
android:textSize="18sp"
android:textStyle="bold" />
</android.support.v7.widget.Toolbar>
请帮帮我们..
答案 0 :(得分:35)
我是这样做的: 来自片段调用
getActivity().setTitle("your title");
您也可以像这样调用父Activity的任何功能:
YourActivity mYourActiviy = (YourActivity) getActivity();
mYourActivity.yourActivityFunction(yourParameters);
答案 1 :(得分:7)
要允许片段与其活动进行通信(设置工具栏标题),您可以在Fragment类中定义一个接口,并在Activity中实现它,如下所述:Communicating with Other Fragments。
答案 2 :(得分:5)
下面在oncreateview
片段方法中写下了答案。
getActivity().setTitle("your name");
答案 3 :(得分:3)
如果您的活动中有setSupportActionBar,那么您可以轻松地从片段中更改工具栏标题
UserChangeForm
答案 4 :(得分:3)
在科特林。
片段中:
(activity as YourActivity).supportActionBar?.title = getString(R.string.your_title)
活动中:
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)
答案 5 :(得分:2)
这项工作对我来说:
Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.id_toolbar);
toolbar.setTitle("New Title");
答案 6 :(得分:1)
您可以在事件OnAttach上更改工具栏的标题,类似这样
var toolbar = activity.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
toolbar.Title = "New Title";
答案 7 :(得分:1)
如果您使用的是自定义工具栏,这将对您有所帮助:
Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
toolbar.setTitle("Feedback");
答案 8 :(得分:1)
在Kotlin,这对我有用。将其放在您的片段类中:
if (activity != null) {
(activity as MainActivity).supportActionBar?.title = getString(R.string.action_history)
}
答案 9 :(得分:1)
如果有人在解决这个问题,那么这可能会有用。
基本上你有4个选项,如何处理:
getActivity().setTitle("Title")
,但在这种情况下,您需要通过调用活动中的Toolbar
将ActionBar
附加到setSupportActionBar()
。Toolbar
的公开实例,并从片段中访问该实例。最后,如果您需要Toolbar
的实例(您可能想要做其他事情),您可以这样做:
Toolbar bar=Toolbar.class.cast(getActivity().findViewById(R.id.toolbar));
好吧,只有当Toolbar
尚未传递给setSupportActionBar
方法时,最后一个选项才能解决问题。
如果是,那么你需要在你的活动中调用这个方法:
supportActionBar.setDisplayShowTitleEnabled(false)
,
这将解决问题。
但是,我建议使用ButterKnife,这会使它更清洁,这里有一个例子:
Toolbar actionBar=findById(getActivity(),R.id.actionBar);
actionBar.setTitle("Title");
答案 10 :(得分:1)
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
FragmentManager.BackStackEntry lastBackStackEntry=null;
int lastBackStackEntryCount = getSupportFragmentManager().getBackStackEntryCount() - 1;
if(lastBackStackEntryCount >= 0 )
{
lastBackStackEntry = getSupportFragmentManager().getBackStackEntryAt(lastBackStackEntryCount);
}
Toast.makeText(MainActivity.this, ""+lastBackStackEntryCount, Toast.LENGTH_SHORT).show();
if(lastBackStackEntryCount == -1)
{
toolbar.setTitle("");
toolbar.setLogo(R.drawable.header_logo);
}
else
{
toolbar.setTitle(lastBackStackEntry.getName());
}
}
});
答案 11 :(得分:1)
在Kotlin中,我使用
fun onAttach(...){
..
activity?.title = "My Title"
}
答案 12 :(得分:1)
您可以在Fragment内创建Interface。检查以下:-
public class MyFragment extends Fragment {
OnMyFragmentListener mListener;
public void setOnMyFragmentListener(OnMyFragmentListener listener) {
this.mListener = listener;
}
@Override
public void onAttach(Context context) {
super.onAttach(context);
if (context instanceof OnMyFragmentListener) {
mListener = (OnMyFragmentListener) context;
mListener.onChangeToolbarTitle("My Fragment");
} else {
throw new RuntimeException(context.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
// This interface can be implemented by the Activity, parent Fragment,
// or a separate test implementation.
public interface OnMyFragmentListener {
public void onChangeToolbarTitle(String title);
}
}
活动中:-
public class MyActivity extends AppCompatActivity implements MyFragment.OnMyFragmentListener {
@Override
public void onChangeToolbarTitle(String title){
toolbar.setTitle(title);
}
}
这对我有用。 :)
答案 13 :(得分:0)
这是一个简单的解决方案。 在扩展 AppCompatActivity 的活动中,您可以这样做:
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
在它的片段里面,你可以这样做:
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(title);
答案 14 :(得分:0)
对我来说,问题是标签由于某种原因而被覆盖。我不得不将其更改回字符串资源,
navigation.xml
在片段标签内;
android:label="@string/android_trivia"
答案 15 :(得分:0)
XML
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_detail"
android:layout_width="match_parent"
android:layout_height="55dp"
android:paddingLeft="10dp"
android:paddingRight="10dp"
app:contentInsetStart="0dp"
app:contentInsetStartWithNavigation="0dp"
android:background="@color/tool_bar_color">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center">
<TextView
android:id="@+id/toolbar_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textColor="#fff"
android:textSize="16sp" />
</LinearLayout>
</android.support.v7.widget.Toolbar>
从工具栏中查找TextView ID
如果您正在使用活动
TextView mTitle = findViewById(R.id.toolbar_title);
mTitle.setText("set your title");
如果您正在使用Fragment
TextView mTitle = view.findViewById(R.id.toolbar_title);
mTitle.setText("set your title");
答案 16 :(得分:0)
您需要在提交片段的活动中设置标题并返回片段
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity(), android.R.style.Theme_Black_NoTitleBar_Fullscreen);
这适合我。
答案 17 :(得分:0)
在您的活动中将工具栏声明为公共。
public class YourActivity : Activity
{
public Toolbar toolbar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = .... // initilize your toolbar
}
}
然后,从您的片段
((YourActivity) getActivity()).toolbar.Title = "Your Title";