Ответ 1
Чтобы разрешить фрагменту взаимодействовать до его действия (для установки заголовка панели инструментов), вы можете определить интерфейс в классе фрагмента и реализовать его в действии, как описано здесь: связь с другими фрагментами.
Я использую последнюю панель инструментов из 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>
Помогите ребятам..
Чтобы разрешить фрагменту взаимодействовать до его действия (для установки заголовка панели инструментов), вы можете определить интерфейс в классе фрагмента и реализовать его в действии, как описано здесь: связь с другими фрагментами.
Я делаю это вот так: из вызова фрагмента
getActivity().setTitle("your title");
Также вы можете вызывать любую функцию родительской активности следующим образом:
YourActivity mYourActiviy = (YourActivity) getActivity();
mYourActivity.yourActivityFunction(yourParameters);
В Котлине.
Во фрагменте:
(activity as YourActivity).supportActionBar?.title = getString(R.string.your_title)
В деятельности:
setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)
Ответ описан ниже в методе oncreateview
фрагментов.
getActivity().setTitle("your name");
Если у вас есть SetSupportActionBar в вашей деятельности, то вы можете легко изменить заголовок панели инструментов из вашего фрагмента
((YourActivity) getActivity()).getSupportActionBar().setTitle("Your Title");
Вы можете создать интерфейс внутри фрагмента. проверьте ниже: -
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);
}
}
Это работает для меня. :)
Эта работа для меня:
Toolbar toolbar = (Toolbar) getActivity().findViewById(R.id.id_toolbar);
toolbar.setTitle("New 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());
}
}
});
В вашей деятельности объявить панель инструментов общедоступной.
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";
Вам нужно установить заголовок в действии, выполняющем фрагмент, и вернуть фрагмент
getSupportFragmentManager().beginTransaction().replace(R.id.main_fragment, mainFragment).commit();
toolbar.setTitle("ShivShambhu");
return contentFragment;
Это работает для меня.
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");
Для меня проблема была в том, что по какой-то причине лейбл был перезаписан. Мне пришлось изменить его обратно на строковый ресурс, в
navigation.xml
внутри тега фрагмента;
android:label="@string/android_trivia"
В Kotlin я использую
fun onAttach(...){
..
activity?.title = "My Title"
}