99

MainFragmentActivityで、カスタム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);

これは完璧に機能します。ただし、 other を開いFragmentsたときに、タイトルを変更したい。これを行うためにメインにアクセスする方法がわかりませんか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>
4

22 に答える 22

153

あなたのしていることは正しいです。はAPI にFragmentsアクセスできないため、 を呼び出す必要があります。あなたが静的な内部クラスでない限り、その場合、親に を作成してアクティビティを呼び出す必要があります。そこから。ActionBargetActivityFragmentWeakReferencegetActionBar

ActionBarカスタム レイアウトを使用しているときにのタイトルを設定するには、Fragmentを呼び出す必要がありますgetActivity().setTitle(YOUR_TITLE)

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

call を取得したくない場合は、をホストするgetTitleに your のテキストを設定する public メソッドを作成する必要があります。TextViewActivityFragment

あなたの活動で

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

あなたのフラグメントで

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

ドキュメント:

Activity.getTitle

Activity.setTitle

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

于 2013-03-22T01:09:11.693 に答える
105

===2019年10月30日更新===

ViewModelLiveDataなどの新しいコンポーネントがあるため、ViewModel と Live Data を使用して Fragment からアクティビティ タイトルを更新する別の/より簡単な方法を使用できます。

アクティビティ

class MainActivity : AppCompatActivity() {
private lateinit var viewModel: MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main_activity)
    if (savedInstanceState == null) {
        supportFragmentManager.beginTransaction()
            .replace(R.id.container, MainFragment.newInstance())
            .commitNow()
    }
    viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
    viewModel.title.observe(this, Observer {
        supportActionBar?.title = it
    })
} }

メインフラグメント

class MainFragment : Fragment() {
companion object {
    fun newInstance() = MainFragment()
}
private lateinit var viewModel: MainViewModel
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View {
    return inflater.inflate(R.layout.main_fragment, container, false)
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    activity?.run {
        viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
    } ?: throw Throwable("invalid activity")
    viewModel.updateActionBarTitle("Custom Title From Fragment")
} }

そして MainModelView:

class MainViewModel : ViewModel() {
private val _title = MutableLiveData<String>()
val title: LiveData<String>
get() = _title
fun updateActionBarTitle(title: String) = _title.postValue(title) }

そして、使用してフラグメントからアクティビティのタイトルを更新できますviewModel.updateActionBarTitle("Custom Title From Fragment")

===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

于 2013-08-02T07:56:57.687 に答える
31

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");
    }
}
于 2014-03-05T18:00:21.557 に答える
9

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

ツールバー

を使用して拡張されます

AppCompatActivity

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

((AppCompatActivity) context).getSupportActionBar().setTitle("Your Title");
于 2018-01-16T10:20:47.377 に答える
8

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

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

interface TopLevelFragment
{
    String getTitle();
}

のタイトルにFragment影響を与えることができる は、このインターフェースを実装します。Activityホスティング活動中に次のように記述します。

@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

于 2015-07-23T09:17:28.273 に答える
5

このように使用できる Fragment では、うまく機能しています。

getActivity().getActionBar().setTitle("YOUR TITLE");
于 2015-02-09T08:27:39.450 に答える
3

以下を使用します。

getActivity().setTitle("YOUR_TITLE");
于 2014-09-15T05:20:56.613 に答える
2

NavigationDrawer を使用するときに、フラグメントから ActionBar のタイトルを設定するための私のソリューションを次に示します。このソリューションではインターフェイスを使用するため、フラグメントは親アクティビティを直接参照する必要はありません。

1) インターフェイスを作成します。

public interface ActionBarTitleSetter {
    public void setTitle(String title); 
}

2) Fragment の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; 
}
于 2015-02-02T13:57:04.437 に答える
1

多くのフラグメントを含むメイン アクティビティがある場合は、通常、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>
于 2014-06-07T13:42:47.663 に答える
0

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

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

あなたのonPageSelected方法でVIEW_PAGER.addOnPageChangeListener

于 2016-12-24T12:40:52.183 に答える
0

選択した回答に追加するだけで、メイン アクティビティに 2 番目のメソッドを追加することもできます。したがって、メイン アクティビティで次のメソッドを使用することになります。

public void setActionBarTitle(String title) {
    getSupportActionBar().setTitle(title);
}

public void setActionBarTitle(int resourceId) {
    setActionBarTitle(getResources().getString(resourceId);
}

R.id.this_is_a_stringこれにより、文字列変数と、strings.xml ファイルなどのリソース ID の両方からタイトルを設定できます。getSupportActionBar().setTitle()これは、リソース ID を渡すことができるため、動作に少し似ています。

于 2015-04-01T17:45:05.950 に答える
0

少なくとも私にとっては、実行時にタブのタイトルを変更するための簡単な答えがありました (よく調べた後)。

TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs); tabLayout.getTabAt(MyTabPos).setText("新しいテキスト");

于 2016-02-17T15:37:49.600 に答える