メインFragmentActivity
で、次のようにカスタムActionBar
タイトルを設定します。
LayoutInflater inflator = (LayoutInflater) this
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = inflator.inflate(R.layout.custom_titlebar, null);
TextView tv = (TextView) v.findViewById(R.id.title);
Typeface tf = Typeface.createFromAsset(this.getAssets(),
"fonts/capsuula.ttf");
tv.setTypeface(tf);
tv.setText(this.getTitle());
actionBar.setCustomView(v);
これは完璧に機能します。ただし、他のFragments
を開いたら、タイトルを変更します。 Main Activity
にアクセスしてこれを行う方法がわかりませんか?過去に、私はこれをしました:
((MainFragmentActivity) getActivity()).getSupportActionBar().setTitle(
catTitle);
誰かが適切な方法についてアドバイスできますか?
XML:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@Android:color/transparent" >
<TextView
Android:id="@+id/title"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_centerVertical="true"
Android:layout_marginLeft="5dp"
Android:ellipsize="end"
Android:maxLines="1"
Android:text=""
Android:textColor="#fff"
Android:textSize="25sp" />
</RelativeLayout>
あなたの活動:
public void setActionBarTitle(String title) {
getSupportActionBar().setTitle(title);
}
そしてあなたのフラグメントで:
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Set title bar
((MainFragmentActivity) getActivity())
.setActionBarTitle("Your title");
}
=== 2015年4月10日更新===
リスナーを使用してアクションバーのタイトルを更新する必要があります
断片:
public class UpdateActionBarTitleFragment extends Fragment {
private OnFragmentInteractionListener mListener;
public UpdateActionBarTitleFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
if (mListener != null) {
mListener.onFragmentInteraction("Custom Title");
}
return inflater.inflate(R.layout.fragment_update_action_bar_title2, container, false);
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
try {
mListener = (OnFragmentInteractionListener) activity;
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement OnFragmentInteractionListener");
}
}
@Override
public void onDetach() {
super.onDetach();
mListener = null;
}
public interface OnFragmentInteractionListener {
public void onFragmentInteraction(String title);
}
}
そしてアクティビティ:
public class UpdateActionBarTitleActivity extends ActionBarActivity implements UpdateActionBarTitleFragment.OnFragmentInteractionListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_update_action_bar_title);
}
@Override
public void onFragmentInteraction(String title) {
getSupportActionBar().setTitle(title);
}
}
詳細はこちら: https://developer.Android.com/training/basics/fragments/communicating.html
あなたがしていることは正しいです。 Fragments
はActionBar
APIにアクセスできないため、getActivity
を呼び出す必要があります。 Fragment
が静的な内部クラスである場合を除き、この場合、親に対してWeakReference
を作成し、そこからActivity .getActionBar
を呼び出す必要があります。
ActionBar
のタイトルを設定するには、カスタムレイアウトを使用しながら、Fragment
でgetActivity().setTitle(YOUR_TITLE)
を呼び出す必要があります。
setTitle
を呼び出す理由は、getTitle
のタイトルとしてActionBar
を呼び出しているためです。 getTitle
は、そのActivity
のタイトルを返します。
getTitle
を呼び出したくない場合は、TextView
をホストするActivity
にFragment
のテキストを設定するパブリックメソッドを作成する必要があります。 _。
あなたのアクティビティ:
public void setActionBarTitle(String title){
YOUR_CUSTOM_ACTION_BAR_TITLE.setText(title);
}
フラグメント内:
((MainFragmentActivity) getActivity()).setActionBarTitle(YOUR_TITLE);
ドキュメント:
また、提供したコードでthis.whatever
を呼び出す必要はありません。ヒントです。
Googleの例では、フラグメント内でこれを使用する傾向があります。
private ActionBar getActionBar() {
return ((ActionBarActivity) getActivity()).getSupportActionBar();
}
フラグメントはActionBarActivityに属し、アクションバーへの参照があります。フラグメントはそれがどんなアクティビティであるかを正確に知る必要はなく、ActionBarActivityを実装するアクティビティに属する必要があるだけなので、これはよりクリーンです。これにより、フラグメントがより柔軟になり、意図したとおりに複数のアクティビティに追加できます。
これで、フラグメントで行う必要があるのはすべてです。
getActionBar().setTitle("Your Title");
通常のフラグメントクラスの代わりに、フラグメントが継承するベースフラグメントがある場合、これはうまく機能します。
public abstract class BaseFragment extends Fragment {
public ActionBar getActionBar() {
return ((ActionBarActivity) getActivity()).getSupportActionBar();
}
}
次に、あなたのフラグメントに。
public class YourFragment extends BaseFragment {
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
getActionBar().setTitle("Your Title");
}
}
Activity
からFragment
のタイトルを設定すると、責任レベルが台無しになります。 Fragment
はActivity
に含まれているため、これはActivity
であり、たとえばFragment
のタイプに応じて独自のタイトルを設定する必要があります。
インターフェイスがあるとします:
interface TopLevelFragment
{
String getTitle();
}
Fragment
のタイトルに影響を与えるActivity
sは、このインターフェースを実装します。ホスティングアクティビティで次のように記述します。
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
FragmentManager fm = getFragmentManager();
fm.beginTransaction().add(0, new LoginFragment(), "login").commit();
}
@Override
public void onAttachFragment(Fragment fragment)
{
super.onAttachFragment(fragment);
if (fragment instanceof TopLevelFragment)
setTitle(((TopLevelFragment) fragment).getTitle());
}
この方法では、Activity
は、複数のTopLevelFragment
sが組み合わされている場合でも、使用するタイトルを常に制御します。これは、タブレットでは非常に可能です。
フラグメントでは、このように使用できますが、私にとってはうまく機能しています。
getActivity().getActionBar().setTitle("YOUR TITLE");
コードに問題がある場合に備えて、getSupportActionBar().setTitle(title)
の代わりにonResume()
をフラグメントのonCreateView(...)
の中に入れてみてください。
MainActivity.Javaで:
public void setActionBarTitle(String title) {
getSupportActionBar().setTitle(title);
}
フラグメント内:
@Override
public void onResume(){
super.onResume();
((MainActivity) getActivity()).setActionBarTitle("Your Title");
}
以下を使用してください。
getActivity().setTitle("YOUR_TITLE");
受け入れられた答えがそれに対する完璧な答えだとは思いません。使用するすべてのアクティビティ
ツールバー
を使用して拡張されます
AppCompatActivity
、それから呼び出されるフラグメントは、タイトルを変更するために以下のコードを使用できます。
((AppCompatActivity) context).getSupportActionBar().setTitle("Your Title");
String []オブジェクトにur Answerを保存し、MainActivityにOnTabChange()をBelowwwwとして設定します。
String[] object = {"Fragment1","Fragment2","Fragment3"};
public void OnTabChange(String tabId)
{
int pos =mTabHost.getCurrentTab(); //To get tab position
actionbar.setTitle(object.get(pos));
}
//Setting in View Pager
public void onPageSelected(int arg0) {
mTabHost.setCurrentTab(arg0);
actionbar.setTitle(object.get(pos));
}
通常、navigationDrawerを使用して、多数のフラグメントを含むメインアクティビティがある場合。そして、あなたはあなたのフラグメントのタイトルの配列を持っています、あなたが戻るためにそれらを変更するために、フラグメントを保持する主な活動にこれを入れてください
@Override
public void onBackPressed() {
int T=getSupportFragmentManager().getBackStackEntryCount();
if(T==1) { finish();}
if(T>1) {
int tr = Integer.parseInt(getSupportFragmentManager().getBackStackEntryAt(T-2).getName());
setTitle(navMenuTitles[tr]); super.onBackPressed();
}
}
これは、各フラグメントにタグを付けることを前提としています。通常、リストで押された位置に応じて、navigationDrawerのリストにフラグメントを追加するときにどこかにタグを付けます。だからその位置は私がタグでキャプチャするものです:
fragmentManager.beginTransaction().
replace(R.id.frame_container, fragment).addToBackStack(position).commit();
さて、navMenuTitlesはonCreateで読み込むものです
// load slide menu items
navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);
配列xmlは、strings.xmlの配列タイプの文字列リソースです。
<!-- Nav Drawer Menu Items -->
<string-array name="nav_drawer_items">
<item>Title one</item>
<item>Title Two</item>
</string-array>
NavigationDrawerを使用する場合、フラグメントからActionBarタイトルを設定するための私のソリューションを次に示します。このソリューションではインターフェイスを使用しているため、フラグメントは親アクティビティを直接参照する必要がありません。
1)インターフェイスを作成します。
public interface ActionBarTitleSetter {
public void setTitle(String title);
}
2)フラグメントのonAttachで、アクティビティをInterfaceタイプにキャストし、SetActivityTitleメソッドを呼び出します。
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
((ActionBarTitleSetter) activity).setTitle(getString(R.string.title_bubbles_map));
}
3)アクティビティで、ActionBarTitleSetterインターフェイスを実装します。
@Override
public void setTitle(String title) {
mTitle = title;
}
googleより提供されているAndroid studio 1.4安定テンプレートを使用している場合、関連するフラグメントがif条件を呼び出すonNavigationItemSelected
メソッドで次のコードを記述する必要がありました。
setTitle("YOUR FRAGMENT TITLE");
フラグメントまたは任意のアクティビティで、頭痛のないActionBarタイトルを設定する非常に簡単なソリューションを取得しています。
以下のようにツールバーが定義されているxmlを変更します。
<Android.support.design.widget.AppBarLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:theme="@style/AppTheme.AppBarOverlay">
<Android.support.v7.widget.Toolbar
Android:id="@+id/toolbar"
Android:layout_width="match_parent"
Android:layout_height="?attr/actionBarSize"
Android:background="@color/colorPrimaryDark"
app:popupTheme="@style/AppTheme.PopupOverlay" >
<TextView
style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
Android:id="@+id/toolbar_title"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:text="@string/app_name"
/>
</Android.support.v7.widget.Toolbar>
</Android.support.design.widget.AppBarLayout>
1)フラグメントにアクションバーを設定する場合:
Toolbar toolbar = findViewById(R.id.toolbar);
TextView toolbarTitle = (TextView) toolbar.findViewById(R.id.toolbar_title);
どこからでも使用するために、アクティビティでメソッドを定義できます
public void setActionBarTitle(String title) {
toolbarTitle.setText(title);
}
アクティビティでこのメソッドを呼び出すには、単に呼び出します。
setActionBarTitle("Your Title")
アクティビティのフラグメントからこのメソッドを呼び出すには、単に呼び出します。
((MyActivity)getActivity()).setActionBarTitle("Your Title");
そのようなキャストのアプローチのマイナス面
((MainFragmentActivity) getActivity()).getSupportActionBar().setTitle(
catTitle);
フラグメントがMainActivityFragmentの外部で再利用できなくなったことです。そのアクティビティ以外で使用する予定がない場合は、問題はありません。より良いアプローチは、アクティビティに応じて条件付きでタイトルを設定することです。したがって、フラグメント内に次のように記述します。
if (getActivity() instanceof ActionBarActivity) {
((ActionBarActivity) getActivity()).getSupportActionBar().setTitle("Some Title");
}
少なくとも私にとっては、実行時にタブのタイトルを変更することに対する簡単な答えがありました。
TabLayout tabLayout =(TabLayout)findViewById(R.id.tabs); tabLayout.getTabAt(MyTabPos).setText( "My New Text");
MainActivityのonCreate:
の下
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
そして、onResume
の下のフラグメントアクティビティで:
getActivity().setTitle(R.string.app_name_science);
オプション:-null参照の警告が表示される場合
Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);
Objects.requireNonNull(getActivity()).setTitle(R.string.app_name_science);
ViewPager
(私の場合のように)を使用している場合は、次を使用できます。
getSupportActionBar().setTitle(YOURE_TAB_BAR.getTabAt(position).getText());
VIEW_PAGER.addOnPageChangeListener
のonPageSelected
メソッドで
タイトルの変更に最適なイベントonCreateOptionsMenu
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.general, container,
setHasOptionsMenu(true); // <-Add this line
return view;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
// If use specific menu
menu.clear();
inflater.inflate(R.menu.path_list_menu, menu);
// If use specific menu
((AppCompatActivity) getActivity()).getSupportActionBar().setTitle("Your Fragment");
super.onCreateOptionsMenu(menu, inflater);
}
簡単なKotlinの例
これらのgradle depsがプロジェクトのバージョンと一致するか、より高いバージョンであると仮定します。
kotlin_version = '1.3.41'
nav_version_ktx = '2.0.0'
これをフラグメントクラスに適合させます。
/**
* A simple [Fragment] subclass.
*
* Updates the action bar title when onResume() is called on the fragment,
* which is called every time you navigate to the fragment
*
*/
class MyFragment : Fragment() {
private lateinit var mainActivity: MainActivity
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
//[...]
mainActivity = this.activity as MainActivity
//[...]
}
override fun onResume() {
super.onResume()
mainActivity.supportActionBar?.title = "My Fragment!"
}
}
選択した回答に追加するだけで、メインアクティビティに2つ目のメソッドを追加することもできます。したがって、メインアクティビティで次のメソッドを使用することになります。
public void setActionBarTitle(String title) {
getSupportActionBar().setTitle(title);
}
public void setActionBarTitle(int resourceId) {
setActionBarTitle(getResources().getString(resourceId);
}
これにより、String変数と、strings.xmlファイルのR.id.this_is_a_string
などのリソースIDの両方からタイトルを設定できます。これは、リソースIDを渡すことができるため、getSupportActionBar().setTitle()
の動作に少し似ています。
上記のように多くの方法があります。 onNavigationDrawerSelected()
あなたのDrawerActivity
でこれを行うこともできます
public void setTitle(final String title){
((TextView)findViewById(R.id.toolbar_title)).setText(title);
}
@Override
public void onNavigationDrawerItemSelected(int position) {
// update the main content by replacing fragments
fragment = null;
String title = null;
switch(position){
case 0:
fragment = new HomeFragment();
title = "Home";
break;
case 1:
fragment = new ProfileFragment();
title = ("Find Work");
break;
...
}
if (fragment != null){
FragmentManager fragmentManager = getFragmentManager();
fragmentManager
.beginTransaction()
.replace(R.id.container,
fragment).commit();
//The key is this line
if (title != null && findViewById(R.id.toolbar_title)!= null ) setTitle(title);
}
}