나는를 사용하는 새로운 프로젝트를 시작 해요 AppCompat/ActionBarCompat
에서 v7
지원 라이브러리를. getSupportActionBar
조각 내에서 를 사용하는 방법을 알아 내려고 노력 중 입니다. 조각을 호스팅하는 내 활동은 확장 ActionBarActivity
되지만 조각에 대한 유사한 지원 클래스가 표시되지 않습니다.
내 조각 내에서
public class CrimeFragment extends Fragment {
//...
getActivity().getSupportActionBar().setSubtitle(R.string.subtitle); // getSupportActionBar is not defined in the v4 version of Fragment
//...
}
그것을 사용하기위한 구글 페이지 ( http://android-developers.blogspot.in/2013/08/actionbarcompat-and-io-2013-app-source.html )는 v4
조각에 대한 변경이 없어야한다고 말합니다 . 내 모든 getActivity()
통화를 에 캐스팅해야 ActionBarActivity
합니까? 디자인이 좋지 않은 것 같습니다.
답변
후 Fragment.onActivityCreated (…) 당신이 getActivity를 통해 액세스 할 수있는 유효한 활동을해야합니다 ().
이를 ActionBarActivity로 캐스트 한 다음 getSupportActionBar ()를 호출해야합니다.
((AppCompatActivity)getActivity()).getSupportActionBar().setSubtitle(R.string.subtitle);
캐스트가 필요합니다. 열악한 디자인이 아니라 이전 버전과의 호환성입니다.
답변
이 질문은 이미 허용 답을 가지고 있지만, 나는 그것이 완전히 정확하지 않은 점을 지적해야 호출 getSupportActionBar()
에서하는 Fragment.onAttach()
원인이됩니다 NullPointerException
활동이 회전 할 때.
짧은 답변:
대신 ((ActionBarActivity)getActivity()).getSupportActionBar()
in onActivityCreated()
(또는 수명주기 이후의 모든 지점)을 사용하십시오 onAttach()
.
긴 대답 :
그 이유는 ActionBarActivity
회전 후를 다시 만들면 실제로 개체를 만들기 전에 모든 조각을 복원 하기 때문입니다 ActionBar
.
소스 코드 ActionBarActivity
에서 support-v7
라이브러리 :
@Override
protected void onCreate(Bundle savedInstanceState) {
mImpl = ActionBarActivityDelegate.createDelegate(this);
super.onCreate(savedInstanceState);
mImpl.onCreate(savedInstanceState);
}
ActionBarActivityDelegate.createDelegate()
mImpl
Android 버전에 따라 객체를 생성합니다 .super.onCreate()
isFragmentActivity.onCreate()
, 회전 후 이전 조각을 복원합니다 (FragmentManagerImpl.dispatchCreate()
, & c).mImpl.onCreate(savedInstanceState)
isActionBarActivityDelegate.onCreate()
,mHasActionBar
창 스타일에서 변수 를 읽습니다 .- Before
mHasActionBar
가 true이면getSupportActionBar()
항상을 반환null
합니다.
출처 ActionBarActivityDelegate.getSupportActionBar()
:
final ActionBar getSupportActionBar() {
// The Action Bar should be lazily created as mHasActionBar or mOverlayActionBar
// could change after onCreate
if (mHasActionBar || mOverlayActionBar) {
if (mActionBar == null) {
... creates the action bar ...
}
} else {
// If we're not set to have a Action Bar, null it just in case it's been set
mActionBar = null;
}
return mActionBar;
}
답변
누군가 com.android.support:appcompat-v7 : 및 AppCompatActivity를 활동으로 사용하면 작동합니다.
((AppCompatActivity)getActivity()).getSupportActionBar().setSubtitle(R.string.subtitle);
답변
귀하의 fragment.xml
추가 Toolbar
지원 라이브러리의 태그
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:layout_collapseMode="pin"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
이제 MyFragment
수업 에서 어떻게 제어 할 수 있습니까? 보자
내부 onCreateView
기능은 다음을 추가
mToolbar = (Toolbar) view.findViewById(R.id.toolbar);
((AppCompatActivity)getActivity()).setSupportActionBar(mToolbar);
//add this line if you want to provide Up Navigation but don't forget to to
//identify parent activity in manifest file
((AppCompatActivity)getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
items
툴바 에 추가 하려면 함수 안에이 줄 MyFragment
을 must
추가하세요.onCreateView
setHasOptionsMenu(true);
이 줄은 중요합니다. 잊어 버린 경우 android는 메뉴 항목을 채우지 않습니다.
우리가 그들을 식별한다고 가정 menu/fragment_menu.xml
그 후 다음 기능을 재정의하십시오.
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.fragment_menu, menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case R.id.action_1:
// do stuff
return true;
case R.id.action_2:
// do more stuff
return true;
}
return false;
}
도움이 되었기를 바랍니다
답변
Pierre-Antoine LaFayette의 답변에 대한 업데이트 된 답변으로
ActionBarActivity는 더 이상 사용되지 않습니다. 사용하는 AppCompatActivity
대신
((AppCompatActivity)getActivity()).getSupportActionBar();
답변
kotlin을 사용하는 사람들을 위해
(activity as AppCompatActivity).supportActionBar.setSubtitle(R.string.subtitle)