조각에서 사용자 지정 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
대한 액세스 권한이 없으므로 . 당신이하지 않는 정적 내부 클래스이며,이 경우 당신은을 만들어야 부모와 통화 활동에. 거기에서.ActionBar
getActivity
Fragment
WeakReference
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
'의 제목은 다음이 인터페이스를 구현합니다. 호스팅 활동에서 다음과 같이 작성합니다.
@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가 결합 되더라도 어떤 타이틀을 사용할지 항상 제어 할 수 있습니다. 이는 태블릿에서 가능합니다.
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_string
strings.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
'programing' 카테고리의 다른 글
Java를 사용하여 디렉토리의 모든 파일을 재귀 적으로 나열 (0) | 2020.10.06 |
---|---|
지정된 실행 파일 외부의 단일 단계 어셈블리 코드에 gdb를 사용하면 "현재 함수의 범위를 찾을 수 없습니다"오류가 발생합니다. (0) | 2020.10.06 |
목록이나 시리즈를 Pandas DataFrame에 행으로 추가 하시겠습니까? (0) | 2020.10.06 |
Grails에서 SQL 문을 기록하는 방법 (0) | 2020.10.06 |
가장 가까운 10 (또는 100 또는 X)으로 반올림하는 방법은 무엇입니까? (0) | 2020.10.06 |