programing

조각에서 사용자 지정 ActionBar 제목 설정

nasanasas 2020. 10. 6. 08:18
반응형

조각에서 사용자 지정 ActionBar 제목 설정


내 Main 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제목이 변경되기를 원합니다. Activity이 작업을 수행하기 위해 Main 액세스하는 방법을 모르겠 습니까? 과거에는 이렇게했습니다.

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


당신이하는 일은 옳습니다. API에 Fragments대한 액세스 권한이 없으므로 . 당신이하지 않는 정적 내부 클래스이며,이 경우 당신은을 만들어야 부모와 통화 활동에. 거기에서.ActionBargetActivityFragmentWeakReferencegetActionBar

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

문서 :

Activity.getTitle

Activity.setTitle

또한 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'의 제목은 다음이 인터페이스를 구현합니다. 호스팅 활동에서 다음과 같이 작성합니다.

@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가 결합 되더라도 어떤 타이틀을 사용할지 항상 제어 할 수 있습니다. 이는 태블릿에서 가능합니다.


Fragment에서 우리는 이렇게 사용할 수 있습니다. 그것은 저에게 잘 작동합니다.

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

코드에 문제가있는 경우를 대비 하여 ie 대신 조각 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");

많은 조각을 넣은 주 활동이있는 경우 일반적으로 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>

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를 사용할 때 조각에서 ActionBar 제목을 설정하는 솔루션은 다음과 같습니다. 이 솔루션은 인터페이스를 사용하므로 조각이 부모 활동을 직접 참조 할 필요가 없습니다.

1) 인터페이스 생성 :

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

2) Fragment의 onAttach 에서 활동을 인터페이스 유형으로 캐스팅하고 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; 
}

이렇게 캐스팅하는 방법의 단점

((MainFragmentActivity) getActivity()).getSupportActionBar().setTitle(
        catTitle);

조각은 더 이상 MainActivityFragment 외부에서 재사용 할 수 없다는 것입니다. 해당 활동 외부에서 사용할 계획이 없다면 문제가 없습니다. 더 나은 접근 방식은 활동에 따라 조건부로 제목을 설정하는 것입니다. 따라서 조각 안에 다음과 같이 작성합니다.

if (getActivity() instanceof ActionBarActivity) {
    ((ActionBarActivity) getActivity()).getSupportActionBar().setTitle("Some Title");
}

구글에서 제공하는 안드로이드 스튜디오 1.4 안정 템플릿을 단순하게 사용하고 onNavigationItemSelected있다면 관련 프래그먼트가 if 조건을 호출하는 메소드에 다음 코드를 작성해야했습니다 .

 setTitle("YOUR FRAGMENT TITLE");

두통없이 단편 또는 모든 활동에서 ActionBar Title을 설정하는 매우 간단한 솔루션을 얻고 있습니다.

아래와 같이 Toolbar가 정의 된 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");

선택한 답변에 추가하기 위해 주 활동에 두 번째 방법을 추가 할 수도 있습니다. 따라서 주요 활동에서 다음 방법을 사용하게됩니다.

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

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

이렇게하면 R.id.this_is_a_stringstrings.xml 파일 과 같은 리소스 ID뿐 아니라 String 변수에서 제목을 설정할 수 있습니다 . 이것은 또한 getSupportActionBar().setTitle()리소스 ID를 전달할 수 있기 때문에 작동 방식 과 비슷하게 작동합니다.


위에서 설명한대로 여러 가지 방법이 있습니다. 당신은 또한 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);
    }
}

적어도 나에게는 런타임에 탭 제목을 변경하는 것에 대한 쉬운 대답이있었습니다.

TabLayout tabLayout = (TabLayout) findViewById (R.id.tabs); tabLayout.getTabAt (MyTabPos) .setText ( "My New Text");


If you're using ViewPager (like my case) you can use:

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

in onPageSelected method of your VIEW_PAGER.addOnPageChangeListener


Best event for change title 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);
}

In your MainActivity, under onCreate:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

And in your fragment activity under onResume:

getActivity().setTitle(R.string.app_name_science);

Optional:- if they show warning of null reference

Objects.requireNonNull(getSupportActionBar()).setDisplayHomeAsUpEnabled(true);


Objects.requireNonNull(getActivity()).setTitle(R.string.app_name_science);

A simple Kotlin example

Assuming these gradle deps match or are higher version in your project:

kotlin_version = '1.3.41'
nav_version_ktx = '2.0.0'

Adapt this to your fragment classes:

    /**
     * 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!"
    }


    }

참고URL : https://stackoverflow.com/questions/15560904/setting-custom-actionbar-title-from-fragment

반응형