Установить заголовок inToolBar из Fragment в Android

Я использую последнюю панель инструментов из AppCompatv7 lib.I поместил текстовое представление в панель инструментов ToolBar. Я хочу установить заголовок в это текстовое представление из фрагмента в моей активности. В случае пользовательской панели действий ((ActionBarActivity ) getActivity).setcustomView(..) выполнил бы эту работу. Но из-за использования этой ToolBar я не могу использовать это. Также я реализовал метод в моей BaseActivity, который унаследован всеми Activity.This 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>

Помогите ребятам..

Ответ 1

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

Ответ 2

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

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

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

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

Ответ 3

В Котлине.

Во фрагменте:

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

В деятельности:

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

Вы можете создать интерфейс внутри фрагмента. проверьте ниже: -

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

}

Это работает для меня. :)

Ответ 7

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

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

toolbar.setTitle("New Title");

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

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

В принципе у вас есть 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");

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

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

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

Ответ 14

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

Ответ 15

Для меня проблема была в том, что по какой-то причине лейбл был перезаписан. Мне пришлось изменить его обратно на строковый ресурс, в

 navigation.xml 

внутри тега фрагмента;

android:label="@string/android_trivia"

Ответ 16

В Kotlin я использую

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