우리는 '안드로이드' 를 구현할 수 있는 방법이 옹박프레스트 () 에 있는 것과 비슷한 부분이 저희에게는힘과 구현하십시오 안드로이드 작업을요?
조각 같은 수명주기의 옹박프레스트 없는 ' ()'. 또 다른 방법을 통해 다른 유지됩니까 옹박프레스트 안드로이드 3.0 () '가' 조각?
내가 이런 식으로 '해결' 에 오버라이드합니다 옹박프레스트 활동까지입니다. '모든' 프레이크망트란스카션 '이' 전에 아다토백스타크 커밋합니다:
@Override
public void onBackPressed() {
int count = getSupportFragmentManager().getBackStackEntryCount();
if (count == 0) {
super.onBackPressed();
//additional code
} else {
getSupportFragmentManager().popBackStack();
}
}
최선의 방법이라고 나는 것
만들기 간편한 인터페이스:
public interface IOnBackPressed {
/**
* If you return true the back press will not be taken into account, otherwise the activity will act naturally
* @return true if your processing has priority if not false
*/
boolean onBackPressed();
}
또한 사용자의 활동을
public class MyActivity extends Activity {
@Override public void onBackPressed() {
Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.main_container);
if (!(fragment instanceof IOnBackPressed) || !((IOnBackPressed) fragment).onBackPressed()) {
super.onBackPressed();
}
} ...
}
마지막으로 네 조각:
public class MyFragment extends Fragment implements IOnBackPressed{
@Override
public boolean onBackPressed() {
if (myCondition) {
//action not popBackStack
return true;
} else {
return false;
}
}
}
interface IOnBackPressed {
fun onBackPressed(): Boolean
}
class MyActivity : AppCompatActivity() {
override fun onBackPressed() {
val fragment =
this.supportFragmentManager.findFragmentById(R.id.main_container)
(fragment as? IOnBackPressed)?.onBackPressed()?.not()?.let {
super.onBackPressed()
}
}
}
부분 대상 환경에서 구현하십시오 # 3 -
class MyFragment : Fragment(), IOnBackPressed {
override fun onBackPressed(): Boolean {
return if (myCondition) {
//action not popBackStack
true
} else {
false
}
}
}
그 다음은 의사코드 방법을 따르면 @HaMMeRed 작동하잖아. 주 업무는 활동을 할 수 있는 자 '조각' 브라이스티비티 호출됨 (주로 스리딩메누 lib 예). 다음은 단계만으로
인터페이스를 구현하는 방법을 가지고 그 생성 및 클래스용 인터페이스입니다 일반 먼저 필요하다.
공용 인터페이스입니다 옹박프레스트리스트너 { public void 도백 (); }
public class 는 옹박프레스트리스트너 바제백프레스트리스트너 { 최종 프레이크망스티비티 개인 활동.
공용 바제백프레스트리스트너 (프레이크망스티비티 활동) { 티스트라스티비티 = 활동. }
@Override public void 도백 () { 스포프백스타크 스티비티오크레스포르트 프레이크망만거 () (null, FragmentManager.POP_BACK_STACK_INCLUSIVE); } }
금지되었는지 옹박프레스트리스트너 옹박프레스트리스트너.
public void 시튼백프레스트리스트너 (옹박프레스트리스트너 옹박프레스트리스트너) { 티s.옹박프레스트리스트너 = 옹박프레스트리스트너. }
뭐 그런 '에서' 옹박프레스트 구현하십시오 오버라이드합니다 6.을 (를)
@Override public void 옹박프레스트 () { if (null 옹박프레스트리스트너! =) 옹박프레스트리스테네스터도백 (); 다른 스페리옹박프레스트 ();
@Override 공용 보기에 언크리티비우 (레이우틴플라터 인플레이터, 비베그룹 컨테이너인 번들에는 사브딘스턴스국가) { 활동 = 그레이스티비티 ();
((브라이스티비티) 활동) 윈스턴백프레스트리스트너 (새 바제백프레스트리스트너 (활동));
보기 보기 =. . 함께 //stuff 보기
다시 보기; }
이제 다시 클릭하면 보실 수 있는 사용자 정의 부분 짜잔 합니다 뒤로를 메서드입니다.
이 협력했습니다 가져다줄래요: https://stackoverflow.com/a/27145007/3934111
@Override
public void onResume() {
super.onResume();
if(getView() == null){
return;
}
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK){
// handle back button's click listener
return true;
}
return false;
}
});
}
그러한 종류의 그들이성년에 경우 사용자가 필요로 하는 기능을 추가한 다음 무시하려면 it in your 활동, 'a' 당신의 모든 관련 있는 조각 조각, 유르바크프레스트 인터페이스입니다 전화하시기 뒤로를 버튼을 누를 때마다.
편집: 저의 이전 첨부하려면 i&; d # 39 와 같은 대답.
If I were 이를 위해 현재 I& 사용할 경우, 또는 기타 브로드캐스트에; d # 39 는 제가 걱정했던것 순서화된 브로드캐스트에 업데이트하려면 적절히 이용하여 마스터야 / 주요 내용이 다른 패널과 패널.
'로카레브로드카스트만거' 에서 지원 라이브러리 도움을 줄 수 있는 '와' 이, 방금 가입 브로드캐스트에 옹박프레스트 보낼 수 있는 조각과 그 사고를 당했다. 내 생각에 메시징으로 것이 더 나은 것 때문에 이제 내 공식 구축상의 권장안을 배율입니다 구축 및 분리 될 것 "이라고 말했다. 그냥 '의도' & # 39 의 작업을 위해 필터링합니다 사용하여 메시지가 있다. 새로 만든 '보내기' 에서 활동, 이에 대한 귀를 ACTION_BACK_PRESSED send it 관련 부분.
이 질문에 대한 답을 드리겠습니다, 이들 중 일부는 이후 5 년 이상 된 내 솔루션이므로 공유할 수 있다. 이는 @oyenigun 후속 및 현대화에 대한 답을
이 때문에 일부 작은 조각을 가지고 있는 뷰) 을 구현하는 데 필요한 내가 사용하고 있는 작은 뒤로를 버튼를 생략하려면 싶다 등 모든 사람에게 좋은 정보 등을 총괄적으로 등장하고 있지만, 이것은 무시하려면 δ1 조각이 뒤로 버튼을 비헤이비어에 합니다.
public interface Backable {
boolean onBackPressed();
}
이 인터페이스입니다 에 전화해서 '박이블' (I& 잔소리가 심한 사람, m a # 39 의 명명 규칙), 'a' () 는 단 하나의 방법 '가치' 가 부울을 옹박프레스트 반품해야 합니다. 부울 값을 적용 해야 할 수 있기 때문에, 단추 누름에 " absorbed" 뒤로를 다운로드되었는지 있다. 뒤쪽 이벤트. 'True' 돌아온 것은 더 이상 없다고 밝히고 있고, 그렇지 않으면, '거짓' 필요한 조치 작업은 여전히 뒤로를 기본값입니다 이뤄져야 한다. 이 인터페이스입니다 제공하십시오 it& # 39 의 자체 파일 (대부분 이름이 '인터페이스와도 별도의 패키지'). 네 좋습니다 패키지로 클래스뿐만 너희에게베풀어진 분리하는 것이 있다.
, 상위 두 번째 조각 찾기
내가 만든 단편 '마지막' 반환하는 메서드입니다 스택할 뒤로를 (object). 내가 사용하는 것이다. # 39 의 ID& 사용하는 경우, 필요에 따라 변경합니다. 나는 이 정적 메서드에 다루는 클래스를 유틸리티 탐색 상태, etc. 물론 가장 적합한 것이 곳에 있습니다. # 39 라는 나프티우스 교화를 위해 I&, ve 동일팔레트에 내거냐 클래스에서 ','.
public static Fragment getCurrentFragment(Activity activity) {
FragmentManager fragmentManager = activity.getFragmentManager();
if (fragmentManager.getBackStackEntryCount() > 0) {
String lastFragmentName = fragmentManager.getBackStackEntryAt(
fragmentManager.getBackStackEntryCount() - 1).getName();
return fragmentManager.findFragmentByTag(lastFragmentName);
}
return null;
}
그렇지 않으면 0 보다 크면 smartupdate 스택할 카운트입니다 뒤로 던져 '할 수 있는' 아라유토프보운세스세페시옹 http://support. 런타임용으로 개발하십시오. # 39 는 0 보다 크면, isn& 경우 복귀하십시오 nulll. # 39, ll 확인할지 we& null 값이 된다.
, 제 3 의 조각은 구현하십시오.
어떤 인터페이스를 구현하는 '조각' 박이블 필요한 곳에 뒤로를 무시하려면 버튼 비헤이비어를. 구현 방법을 추가합니다.
public class SomeFragment extends Fragment implements
FragmentManager.OnBackStackChangedListener, Backable {
...
@Override
public boolean onBackPressed() {
// Logic here...
if (backButtonShouldNotGoBack) {
whateverMethodYouNeed();
return true;
}
return false;
}
}
옹박프레스트 () ',' 의 모든 논리를 동일팔레트에 오버라이드합니다 합니다. 스케쳐내 뒤로를 진정한 스택할 다시 돌아올 수 없는 팝 (기본값입니다 비헤이비어를), 그 뒤에 행사는 푹 빠졌다. 그렇지 않으면 반품하십시오 거짓값.
오버라이드합니다 옹박프레스트 방법 및 추가 로직을 () '' 이 있다.
@Override
public void onBackPressed() {
// Get the current fragment using the method from the second step above...
Fragment currentFragment = NavUtils.getCurrentFragment(this);
// Determine whether or not this fragment implements Backable
// Do a null check just to be safe
if (currentFragment != null && currentFragment instanceof Backable) {
if (((Backable) currentFragment).onBackPressed()) {
// If the onBackPressed override in your fragment
// did absorb the back event (returned true), return
return;
} else {
// Otherwise, call the super method for the default behavior
super.onBackPressed();
}
}
// Any other logic needed...
// call super method to be sure the back button does its thing...
super.onBackPressed();
}
현재 우리가 해야 할 수 있는지 확인하고 뒤로를 절의 스택할 관심용 널 (null) 는 '우리' 박이블 인터페이스입니다. 만약 그렇다면 있는지 이 행사는 푹 빠졌다. # 39, re () '와 함께' 옹박프레스트 비활성화되면 we& 수행됨 반환할 수 있습니다. 그렇지 않으면 이를 치료하는 뒤로를 언론과 일반 security. 슈퍼 메서드입니다.
추상 클래스를 작성할 연장시킵니다 조각 및 '는' 비베그론키리스트너 인터페이스입니다.
import android.app.Fragment;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
public abstract class BackableFragment extends Fragment implements View.OnKeyListener {
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(this);
}
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
onBackButtonPressed();
return true;
}
}
return false;
}
public abstract void onBackButtonPressed();
}
모든 것을 알 수 있듯이, '조각' 은 '클릭' 비베그론키리스트너 사용하여 자동으로 캡처하지 연장시킵니다 박이블프레이크망 뒤로를 인터페이스입니다. 그냥 security. 추상 '옹박버튼프레스트 ()' 에서 '방법을 사용하여 표준 분별할 수 있는 방법을 구현됩니까 론키 ()' 논리를 뒤로를 단추 누름에. 주요 버튼을 클릭하면 장부를요 할 경우 반드시 뒤로를 아닌, 그냥 '슈퍼' 때 ' ()' 에 호출하십시오 메서드로부터 론키 조각, 그렇지 않으면, ll 재정의을 you& 비헤이비어를 override # 39 의 추상화.
그냥 간단한 사용, 확장 및 구현:
public class FragmentChannels extends BackableFragment {
...
@Override
public void onBackButtonPressed() {
if (doTheThingRequiringBackButtonOverride) {
// do the thing
} else {
getActivity().onBackPressed();
}
}
...
}
이후 '추상 클래스는 옹박버튼프레스트 ()', '옹박버튼프레스트 확장할 수 있는 방법을 한 번 ()' 슈퍼 구현해야 합니다. 이 때문에 내 동작을 수행하는 데 필요한 '그냥' void 되돌려줍니다 부분 클래스 및 언론의 흡음률 전달할 필요는 백됩니다 활동까지입니다. Smartupdate you do security. 옹박프레스트 () '활동,' re back 버튼을 doesn& 경우, 어떤 방법을 you& # 39 업무를 하고, 그렇지 않으면, t # 39 취급료 뒤로를 버튼를 비활성화됨을 합니다. # 39, t don& 진실이며당신이 것을 원하는!
만약에 이 유용한 사람이 됐으면 좋겠다 "고 말했다. 즐거운 코딩.
해법은 간단하다.
/*
* called when on back pressed to the current fragment that is returned
*/
public void onBackPressed()
{
// add code in super class when override
}
private BaseFragment _currentFragment;
@Override
public void onBackPressed()
{
super.onBackPressed();
_currentFragment.onBackPressed();
}
@Override
public void onBackPressed()
{
setUpTitle();
}
왜냐면 옹박프레스트 조각 '수 () 에서 분리하시겠습니까 활동까지입니다.
답변 디아즈 @Sterling 따르면 않노라그분이 그러겄지 생쥐라. 그러나 일부 상황이 될 잘못됐다. (ex. 로테이트 화면)
그래서, 내가 생각하는 ' ()' 목표 달성에 이레모빙 여부를 확인할 수 있었습니다.
'오네타흐 ()' 또는 '오네스트로이비에프 ()' 에서 이 쓸 수 있습니다. 그것은 작동합니다.
@Override
public void onDetach() {
super.onDetach();
if(isRemoving()){
// onBackPressed()
}
}
@Override
public void onDestroyView() {
super.onDestroyView();
if(isRemoving()){
// onBackPressed()
}
}
아래와 같은 프로젝트에 인터페이스입니다 추가해야 합니다.
public interface OnBackPressed {
void onBackPressed();
}
그리고, 조각, 따라 이 인터페이스를 구현할 수 있습니다.
public class SampleFragment extends Fragment implements OnBackPressed {
@Override
public void onBackPressed() {
//on Back Pressed
}
}
이 같은 활동을 옹박프레스트 이벤트 밑에 옹박프레스트 아래에 이벤트 및 트리거할 수 있습니다.
public class MainActivity extends AppCompatActivity {
@Override
public void onBackPressed() {
Fragment currentFragment = getSupportFragmentManager().getFragments().get(getSupportFragmentManager().getBackStackEntryCount() - 1);
if (currentFragment instanceof OnBackPressed) {
((OnBackPressed) currentFragment).onBackPressed();
}
super.onBackPressed();
}
}
그럼 저는 이렇게 done it for me, it 작동합니까
단순한 인터페이스
public interface FragmentOnBackClickInterface {
void onClick();
}
예 구축상의
public class MyFragment extends Fragment implements FragmentOnBackClickInterface {
// other stuff
public void onClick() {
// what you want to call onBackPressed?
}
그럼 그냥 옹박프레스트 오버라이드합니다 활동을
@Override
public void onBackPressed() {
int count = getSupportFragmentManager().getBackStackEntryCount();
List<Fragment> frags = getSupportFragmentManager().getFragments();
Fragment lastFrag = getLastNotNull(frags);
//nothing else in back stack || nothing in back stack is instance of our interface
if (count == 0 || !(lastFrag instanceof FragmentOnBackClickInterface)) {
super.onBackPressed();
} else {
((FragmentOnBackClickInterface) lastFrag).onClick();
}
}
private Fragment getLastNotNull(List<Fragment> list){
for (int i= list.size()-1;i>=0;i--){
Fragment frag = list.get(i);
if (frag != null){
return frag;
}
}
return null;
}
프랑버스 사용하는 경우, 그것은 아마도 훨씬 간단해진다는 해결책:
>. 네 조각:
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
EventBus.getDefault().register(this);
}
@Override
public void onDetach() {
super.onDetach();
EventBus.getDefault().unregister(this);
}
// This method will be called when a MessageEvent is posted
public void onEvent(BackPressedMessage type){
getSupportFragmentManager().popBackStack();
}
또한 자신의 활동 클래스를 정의할 수 있습니다.
@Override
public void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@Override
public void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
// This method will be called when a MessageEvent is posted
public void onEvent(BackPressedMessage type){
super.onBackPressed();
}
@Override
public void onBackPressed() {
EventBus.getDefault().post(new BackPressedMessage(true));
}
포조 객체에는 박프레스트메사게.자바 뿐이다
이것은 슈퍼 청소하십시오 없다 인터페이스입니다 / 구축상의 귀찮아.
이건 내 해결책:
>. in MyActivity.java:
public interface OnBackClickListener {
boolean onBackClick();
}
private OnBackClickListener onBackClickListener;
public void setOnBackClickListener(OnBackClickListener onBackClickListener) {
this.onBackClickListener = onBackClickListener;
}
@Override
public void onBackPressed() {
if (onBackClickListener != null && onBackClickListener.onBackClick()) {
return;
}
super.onBackPressed();
}
>. 또한 Fragment:
((MyActivity) getActivity()).setOnBackClickListener(new MyActivity.OnBackClickListener() {
@Override
public boolean onBackClick() {
if (condition) {
return false;
}
// some codes
return true;
}
});
public class MyActivity extends Activity {
protected OnBackPressedListener onBackPressedListener;
public interface OnBackPressedListener {
void doBack();
}
public void setOnBackPressedListener(OnBackPressedListener onBackPressedListener) {
this.onBackPressedListener = onBackPressedListener;
}
@Override
public void onBackPressed() {
if (onBackPressedListener != null)
onBackPressedListener.doBack();
else
super.onBackPressed();
}
@Override
protected void onDestroy() {
onBackPressedListener = null;
super.onDestroy();
}
}
public class MyFragment extends Framgent implements MyActivity.OnBackPressedListener {
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
((MyActivity) getActivity()).setOnBackPressedListener(this);
}
@Override
public void doBack() {
//BackPressed in activity will call this;
}
}
@Override
public void onResume() {
super.onResume();
getView().setFocusableInTouchMode(true);
getView().requestFocus();
getView().setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
// handle back button
replaceFragmentToBackStack(getActivity(), WelcomeFragment.newInstance(bundle), tags);
return true;
}
return false;
}
});
}
매우 짧은 달콤하고 대답:
getActivity().onBackPressed();
내 경우 전체 책정안 설명.
나는 내 프라그멘타 마리나스티비티, 나는 프레이크망브 프라그멘타 (프레이크망브 는 하위 또는 네스트된 프라그멘타 조각) 에서 여는
Fragment duedateFrag = new FragmentB();
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.container_body, duedateFrag);
ft.addToBackStack(null);
ft.commit();
이제 스케쳐내 프라그멘타 갈 수 있습니다 (), 간단히 말해 '에서' () 에서 프레이크망브 그레이스티비티 리옹박프레스트 프레이크망브.
항상 추가에는 조각, 동시에
fragmentTransaction.add(R.id.fragment_container, detail_fragment, "Fragment_tag").addToBackStack(null).commit();
다음 주 () '에서' 옹박프레스트 오버라이드합니다 활동,
if (getSupportFragmentManager().getBackStackEntryCount() > 0) {
getSupportFragmentManager().popBackStack();
} else {
finish();
}
뒤로를 버튼를 처리할 수 있는 애플리케이션 (앱) 을
Fragment f = getActivity().getSupportFragmentManager().findFragmentByTag("Fragment_tag");
if (f instanceof FragmentName) {
if (f != null)
getActivity().getSupportFragmentManager().beginTransaction().remove(f).commit()
}