在Android中从Fragment设置标题inToolBar

时间:2014-11-24 07:43:47

标签: android android-toolbar

我一直在使用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>

请帮帮我们..

18 个答案:

答案 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"),但在这种情况下,您需要通过调用活动中的ToolbarActionBar附加到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";