조각에서 현재 활동 완료


96

탐색 창으로 사용중인 활동에 조각이 있습니다. 클릭하면 새 활동을 시작하는 버튼이 포함됩니다 (조각의 startActivity는 단순히 현재 활동에서 startActivity를 호출 함).

내 인생에서 나는 새로운 활동을 시작한 후 현재 활동을 어떻게 끝낼 지 알 수없는 것 같다.

조각에서 다음과 같은 것을 달성하려고합니다.

@Override
public void onClick(View view) {
    // TODO Auto-generated method stub
    if (view == mButtonShows) {
        Intent intent = new Intent(view.getContext(), MyNewActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(intent);
        finish();
    } 
}

그러나 Fragment.class는 finish ()를 구현하지 않는 것 같습니다 (startActivity (...)를 구현하는 것처럼).

두 번째 활동을 시작할 때 활동 백 스택을 지우고 싶습니다. (따라서 새로운 활동에서 뒤로 누르면 기술적으로 런처로 다시 떨어집니다)

답변:


281

조각으로 작업 할 때 this컨텍스트를 사용 하거나 참조하는 대신 항상 getActivity(). 당신은 전화해야합니다

getActivity().finish();

조각에서 활동을 완료합니다.


12
getActivity()null어떤 경우에는 그럴 수 있습니다 . 그러면 우리는 무엇을해야합니까?
Matjaz Kristl 2012

3
@ user983956 이러한 경우 활동은 이미 파괴되었으므로 finish.
Cristian

2
당신이보기 팽창하기 전에 그것을 사용하려고하면 getActivity가 널 (NULL)이 될 수 : 팁으로
csanonymus

1
액티비티는 프래그먼트가 아닌 컨트롤러 / 담당자 여야합니다. 오히려 콜백 인터페이스를 통해 액티비티를 콜백하고 액티비티가 스스로 완료해야하는지 결정하도록해야합니다.
Ahmed

1
또한 활동에 싱글 톤이 주입 된 경우이를 삭제하는 것을 잊지 마십시오. 메모리 누수가 발생하거나 콜백이 있으면 제거합니다. , if (getActivity ()! = null) {getActivity (). removeCallbacks (); getActivity (). destroy (); }
omersem

26

사실은...

나는 조각이 활동을 끝내려고하지 않을 것입니다. 그것은 내 생각에 조각에 너무 많은 권한을 부여합니다. 대신 http://developer.android.com/training/basics/fragments/communicating.html 에서 가이드를 사용합니다.

Fragment가 활동이 구현해야하는 인터페이스를 정의하도록합니다. 활동을 호출 한 다음 활동이 정보로 수행 할 작업을 결정하도록합니다. 활동이 자체적으로 완료되기를 원하면 할 수 있습니다.


2
단일 활동에 여러 조각이있을 수 있으므로 좋은 점입니다. 언급했듯이 프래그먼트가 활동과 다시 통신하는 데 선호되는 방법은 인터페이스를 사용하는 것입니다.
Sasquatch

11

Jon F Hancock 이 언급했듯이 , 이것은 프래그먼트가 종료 할 활동을 제안하여 활동을 '종료'할 수있는 방법입니다. 이것은 조각을 그 이유대로 이식 가능하게 만듭니다. 다른 활동에서 사용하는 경우 활동을 닫고 싶지 않을 수 있습니다.

아래 코드는 저장 및 취소 버튼이있는 활동 및 프래그먼트의 스 니펫입니다.

PlayerActivity

public class PlayerActivity extends Activity 
    implements PlayerInfo.PlayerAddListener {

    public void onPlayerCancel() {
       // Decide if its suitable to close the activity, 
       //e.g. is an edit being done in one of the other fragments?
       finish();
    }
}

호출 활동이 구현해야하는 인터페이스를 포함하는 PlayerInfoFragment.

public class PlayerInfoFragment extends Fragment {
   private PlayerAddListener callback; // implemented in the Activity

   @Override
   public void onAttach(Activity activity) {
     super.onAttach(activity);
     callback= (PlayerAddListener) activity;
   }

   public interface PlayerAddListener {
       public void onPlayerSave(Player p); // not shown in impl above
       public void onPlayerCancel();
   }

   public void btnCancel(View v) {
      callback.onPlayerCancel(); // the activity's implementation
   }
}

1

finish를 사용하여 조각을 닫을 때마다 전체 활동이 닫힙니다. 문서에 따르면 조각은 부모 활동이 유지되는 한 유지되어야합니다.

대신 다음 문을 사용하여 부모 활동으로보기를 다시 변경할 수 있음을 발견했습니다. setContentView (R.layout.activity_main);

그러면 부모 활동으로 돌아갑니다.

나는 이것이 이것을 찾고있는 다른 사람에게 도움이되기를 바랍니다.


1

아주 간단합니다 ...

1- getActivity()조각에서 활동을 잡아라.

2- 그런 다음 전화 finish();

그래서 getActivity().finish();부모 활동을 마칠 것입니다.


1

프래그먼트에서 활동을 완료하려면 getActivity () 메소드를 사용해야합니다.

getActivity().finish();

1

조각에서 getActivity.finishAffinity () 사용

getActivity().finishAffinity();

활동과 함께 스택에서 현재 활동에 의해 푸시 된 모든 조각을 제거합니다 ...


finishAffinity ()는 동일한 선호도를 가진 모든 활동을 제거하므로 스택에 조각을 포함하는 현재 활동 아래의 활동도 완료 될 수 있습니다.
Zakaria M. Jawas

0

이 시도. 경고가 없어야합니다 ...

            Activity thisActivity = getActivity();
            if (thisActivity != null) {
                startActivity(new Intent(thisActivity, yourActivity.class)); // if needed
                thisActivity.finish();
            }

0

2020 년 6 월 15 일-답변 업데이트.

자바와 Kotlin에는 두 가지 옵션이 있습니다. 그러나 두 방법의 논리는 동일합니다. finish () 메서드를 호출 한 후에 액티비티 를 호출 해야합니다 .

Kotlin 대한 답변 ,

활동이 null 일 수없는 경우 Answer_1을 사용 하세요 . 그러나 활동 이 null수있는 경우 Answer_2를 사용 하십시오 .

Answer_1: activity!!.finish()
Answer_2: activity?.finish()

Java에 대한 답변,

getActivity().finish();

뿡 빵뀨


-1

이것을 사용해보십시오

Fragment.class 는 구현하지 않습니다finish()

조각으로 작업 할 때 이것을 사용하거나 컨텍스트를 참조하는 대신 항상 getActivity(). 당신은 전화해야합니다


11
... 나에게 당신의 대답과 (coder_For_Life22 @로) 위의 첫 번째 대답 사이의 diference에게
필리페 브리토에게

함정을하지
마십시오
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.