Установить заголовок inToolBar из фрагмента в Android

Я использую последнюю панель инструментов из appcompatv7 lib.Я поместил textview в ViewGroup панели инструментов, и я хочу установить заголовок в этом Textview из фрагмента в моей деятельности.В случае настраиваемой панели действий ((ActionBarActivity)getActivity).setcustomView(..) сделал бы свою работу.Но из-за использования этой панели инструментов я не могу использовать это.Также я реализовал метод в своей BaseActivity, который наследуется всеми действиями.Эта BaseActivity содержит мой метод для инициализируйте выдвижной ящик слева.Я должен инициализировать метод initDrawerLayout () в activity, иначе ящик не будет инициализирован.И если я инициализирую его во фрагменте, он дает мне все пустые результаты, ни кнопка переключения для ящика, ни пользовательский заголовок не устанавливаются.

Это мой код 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>

пожалуйста помогите парни..

13 ответов


чтобы разрешить фрагменту связываться с его активностью (чтобы установить заголовок панели инструментов), вы можете определить интерфейс в классе Fragment и реализовать его в рамках действия, как описано здесь: связь с другими фрагментами.


Я делаю это, как это: из фрагмента вызов

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

Также вы можете вызвать любую функцию вашей родительской деятельности следующим образом:

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

ответ записывается ниже в oncreateview метод фрагментов.

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

Если у вас есть setSupportActionBar в вашей деятельности, то вы можете легко изменить заголовок панели инструментов из вашего фрагмента

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

вы можете изменить название панели инструментов на событии OnAttach, что-то вроде этого

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

Если вы используете пользовательскую панель инструментов, это поможет вам:

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

если кто-то борется с этой проблемой, это может быть полезно.

в основном у вас есть 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");

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());
                }
            }
        });

эта работа для меня :

Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.id_toolbar);

toolbar.setTitle("New Title");

в вашей деятельности объявите панель инструментов общедоступной.

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

вам нужно установить заголовок в activity commiting фрагмента и вернуть фрагмент

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

это работает для меня.


В Котлин.

фрагмент:

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

в работе:

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

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 из панели инструментов

Если вы используете Activity

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