【问题标题】:Set a title in Toolbar from fragment in Android从Android中的片段在工具栏中设置标题
【发布时间】:2014-11-24 07:43:46
【问题描述】:

我一直在使用 AppCompatv7 lib 中的最新工具栏。我在 ToolBar ViewGroup 中放置了一个 textview 并且我想从我的活动中的片段中为这个 Textview 设置一个标题。如果是自定义操作栏((ActionBarActivity )getActivity).setcustomView(..) 本来可以完成这项工作的。但是由于使用了这个 ToolBar,我无法使用它。此外,我在我的 BaseActivity 中实现了一个由所有活动继承的方法。这个 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>

请大家帮忙..

【问题讨论】:

  • 投反对票的人..你能在投反对票之前回答这个问题吗..我经过大量搜索后问了这个问题。

标签: android android-toolbar


【解决方案1】:

我这样做是这样的: 来自片段调用

getActivity().setTitle("your title");

您也可以像这样调用父 Activity 的任何函数:

YourActivity mYourActiviy = (YourActivity) getActivity();
mYourActivity.yourActivityFunction(yourParameters);

【讨论】:

    【解决方案2】:

    在 Kotlin 中。

    在片段中:

    (activity as YourActivity).supportActionBar?.title = getString(R.string.your_title)
    

    活动中:

    setSupportActionBar(toolbar)
    supportActionBar?.setDisplayHomeAsUpEnabled(true)
    supportActionBar?.setDisplayShowHomeEnabled(true)
    

    【讨论】:

      【解决方案3】:

      要允许 Fragment 与其 Activity 通信(设置工具栏标题),您可以在 Fragment 类中定义一个接口并在 Activity 中实现它,如下所述:Communicating with Other Fragments

      【讨论】:

        【解决方案4】:

        如果您的 Activity 中有 setSupportActionBar,那么您可以轻松地从片段中更改工具栏标题

        ((YourActivity) getActivity()).getSupportActionBar().setTitle("Your Title");
        

        【讨论】:

          【解决方案5】:

          答案写在下面的片段oncreateview方法中。

          getActivity().setTitle("your name");
          

          【讨论】:

            【解决方案6】:

            您可以在 Fragment 中创建接口。检查以下:-

            public class MyFragment extends Fragment {
                OnMyFragmentListener mListener;
            
                // Where is this method called??
                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"); // Call this in `onResume()`
                    } else {
                        throw new RuntimeException(context.toString()
                                + " must implement OnFragmentInteractionListener");
                    }
                }
            
                @Override
                public void onDetach() {
                    super.onDetach();
                    mListener = null;
                }
            
                @Override
                public void onResume(){
                    super.onResume();
                    mListener.onChangeToolbarTitle("My Fragment");
                }
            
            
                // 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);
                }
            
            }
            

            这对我有用。 :)

            【讨论】:

            • 效果很好,但我建议您只使用onAttach(Context context) 来初始化listener 并使用onResume() 来调用侦听器的方法
            • 它不应该像那样困难或复杂
            【解决方案7】:

            如果有人遇到这个问题,这可能会有用。

            基本上你有 4 个选项,如何处理:

            • 使用接口与您的 Activity 或任何其他方便的方法(如事件总线)进行通信。

            • 您调用getActivity().setTitle("Title"),但在这种情况下,您需要通过在您的活动中调用setSupportActionBar() 将您的Toolbar 附加到ActionBar

            • 您可以拥有Toolbar 的公共实例并从片段访问该实例。

            • 最后,如果你需要 Toolbar 的实例(你可能想用它做其他事情),你可以通过这种方式简单地得到它:

              Toolbar bar=Toolbar.class.cast(getActivity().findViewById(R.id.toolbar));

            好吧,只有在 Toolbar 尚未传递给 setSupportActionBar 方法时,最后一个选项才能解决问题。

            如果是,那么你需要在你的activity中调用这个方法:

            supportActionBar.setDisplayShowTitleEnabled(false),

            这将解决问题。

            不过,我建议使用ButterKnife,这样会更简洁一些,这里举个例子:

              Toolbar actionBar=findById(getActivity(),R.id.actionBar);
              actionBar.setTitle("Title");
            

            【讨论】:

            • 你知道你在做什么。很好的答案,谢谢。
            【解决方案8】:

            在 Kotlin 中,我使用

            fun onAttach(...){
            ..
            activity?.title = "My Title"
            }
            

            【讨论】:

              【解决方案9】:

              这在 Kotlin 中对我有用。把它放在你的片段类中:

              if (activity != null) {
                      (activity as MainActivity).supportActionBar?.title = getString(R.string.action_history)
                  }
              

              【讨论】:

                【解决方案10】:

                这对我有用:

                Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.id_toolbar);
                
                toolbar.setTitle("New Title");
                

                【讨论】:

                  【解决方案11】:

                  对我来说,问题是由于某种原因标签被覆盖了。我不得不把它改回字符串资源,在

                   navigation.xml 
                  

                  片段标签内;

                  android:label="@string/android_trivia"
                  

                  【讨论】:

                    【解决方案12】:

                    您可以在事件 OnAttach 上更改工具栏的标题,类似这样

                            var toolbar = activity.FindViewById<Android.Support.V7.Widget.Toolbar>(Resource.Id.toolbar);
                            toolbar.Title = "New Title";
                    

                    【讨论】:

                      【解决方案13】:

                      在您的 Activity 中将工具栏声明为公共的。

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

                      【讨论】:

                        【解决方案14】:

                        如果您使用的是自定义工具栏,这将对您有所帮助:

                        Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.toolbar);
                        toolbar.setTitle("Feedback");
                        

                        【讨论】:

                        • 虽然此代码可以回答问题,但提供有关 如何 和/或 为什么 解决问题的附加上下文将改善答案的长期价值。
                        【解决方案15】:
                        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());
                                        }
                                    }
                                });
                        

                        【讨论】:

                        • 这也将处理第一个片段问题
                        • 这将有助于从后台标签本身加载标题,因此只需要提供正确的标签名称以及您的片段标题
                        【解决方案16】:

                        你需要在提交片段的活动中设置标题并返回片段

                        getSupportFragmentManager().beginTransaction().replace(R.id.main_fragment, mainFragment).commit();
                                    toolbar.setTitle("ShivShambhu");
                                    return contentFragment;
                        

                        这对我有用。

                        【讨论】:

                          【解决方案17】:

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

                          如果您使用的是片段

                           TextView mTitle = view.findViewById(R.id.toolbar_title);
                           mTitle.setText("set your title");
                          

                          【讨论】:

                          • 请不要发布多个问题的重复答案。您的答案应针对每个特定问题量身定制,并且应将相同的问题标记为重复问题。
                          【解决方案18】:

                          这是一个简单的解决方案。 在扩展 AppCompatActivity 的 Activity 中,您可以这样做:

                          Toolbar toolbar = findViewById(R.id.toolbar);
                          setSupportActionBar(toolbar);
                          

                          在它的片段里面,你可以这样做:

                          ((AppCompatActivity) getActivity()).getSupportActionBar().setTitle(title);
                          

                          【讨论】:

                            猜你喜欢
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 1970-01-01
                            • 2016-12-17
                            • 2015-01-17
                            • 1970-01-01
                            相关资源
                            最近更新 更多