web-dev-qa-db-ja.com

フラグメントからカスタムActionBarタイトルを設定する

メイン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>
79
KickingLettuce

あなたの活動:

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

73
Frank Nguyen

あなたがしていることは正しいです。 FragmentsActionBar AP​​Iにアクセスできないため、getActivityを呼び出す必要があります。 Fragmentが静的な内部クラスである場合を除き、この場合、親に対してWeakReferenceを作成し、そこからActivity .getActionBarを呼び出す必要があります。

ActionBarのタイトルを設定するには、カスタムレイアウトを使用しながら、FragmentgetActivity().setTitle(YOUR_TITLE)を呼び出す必要があります。

setTitleを呼び出す理由は、getTitleのタイトルとしてActionBarを呼び出しているためです。 getTitleは、そのActivityのタイトルを返します。

getTitleを呼び出したくない場合は、TextViewをホストするActivityFragmentのテキストを設定するパブリックメソッドを作成する必要があります。 _。

あなたのアクティビティ

public void setActionBarTitle(String title){
    YOUR_CUSTOM_ACTION_BAR_TITLE.setText(title);
}

フラグメント内

((MainFragmentActivity) getActivity()).setActionBarTitle(YOUR_TITLE);

ドキュメント:

Activity.getTitle

Activity.setTitle

また、提供したコードでthis.whateverを呼び出す必要はありません。ヒントです。

146
adneal

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");
    }
}
25
Kalel Wade

ActivityからFragmentのタイトルを設定すると、責任レベルが台無しになります。 FragmentActivityに含まれているため、これはActivityであり、たとえばFragmentのタイプに応じて独自のタイトルを設定する必要があります。

インターフェイスがあるとします:

interface TopLevelFragment
{
    String getTitle();
}

Fragmentのタイトルに影響を与えるActivitysは、このインターフェースを実装します。ホスティングアクティビティで次のように記述します。

@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は、複数のTopLevelFragmentsが組み合わされている場合でも、使用するタイトルを常に制御します。これは、タブレットでは非常に可能です。

7
Aleks N.

フラグメントでは、このように使用できますが、私にとってはうまく機能しています。

getActivity().getActionBar().setTitle("YOUR TITLE");
5
NagarjunaReddy

コードに問題がある場合に備えて、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");
 }
4
realpac

以下を使用してください。

getActivity().setTitle("YOUR_TITLE");
2

受け入れられた答えがそれに対する完璧な答えだとは思いません。使用するすべてのアクティビティ

ツールバー

を使用して拡張されます

AppCompatActivity

、それから呼び出されるフラグメントは、タイトルを変更するために以下のコードを使用できます。

((AppCompatActivity) context).getSupportActionBar().setTitle("Your Title");
2

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));
}
1
Narendra Kumar

通常、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>
1
Miguel

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; 
}
1
Assaf S.

googleより提供されているAndroid studio 1.4安定テンプレートを使用している場合、関連するフラグメントがif条件を呼び出すonNavigationItemSelectedメソッドで次のコードを記述する必要がありました。

 setTitle("YOUR FRAGMENT TITLE");
1
Manan Patel

フラグメントまたは任意のアクティビティで、頭痛のない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");
1
JoboFive

そのようなキャストのアプローチのマイナス面

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

0
Mark

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);
0
Amit Singh

ViewPager(私の場合のように)を使用している場合は、次を使用できます。

getSupportActionBar().setTitle(YOURE_TAB_BAR.getTabAt(position).getText());

VIEW_PAGER.addOnPageChangeListeneronPageSelectedメソッドで

0
Reza

タイトルの変更に最適なイベント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);
}
0
Ahmad Aghazadeh

簡単な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!"
    }


    }
0
lasec0203

選択した回答に追加するだけで、メインアクティビティに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()の動作に少し似ています。

0
CodyEngel

上記のように多くの方法があります。 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);
    }
}
0
tricknology