뒤로 버튼과 같은 버튼을 사용하여 현재 조각을 닫는 방법은 무엇입니까?


85

Imagebutton을 사용하여 현재 조각을 닫으려고합니다.

저는 Fragment-A에 있으며 버튼을 클릭하면 Fragment-B로 바뀝니다.

그리고 Fragment-B 버튼을 클릭하면 Fragment-C로 바뀌고 Fragment-B가 닫힙니다.

Fragment-C에서 뒤로 버튼을 클릭하면 Fragment-A로 돌아갑니다.

내가 시도한 코드는 다음과 같습니다.

camera_album = (ImageButton) view.findViewById(R.id.camera_album);

camera_album.setOnClickListener(new Button.OnClickListener() {
    @Override
    public void onClick(View v) {

                    closefragment();
        Fragment fragment = FileBrowserFragment.newInstance(null, null, null) ;
        MainActivity.addFragment(LocalFileBrowserFragment.this, fragment) ;


    }
});

private void closefragment() {
    getActivity().getFragmentManager().beginTransaction().remove(this).commit();
}

fragment-B에서 뒤로 버튼을 클릭하면 Fragment-C로 바뀝니다.

그러나 Fragment-C에서 뒤로 버튼을 클릭하면 Fragment-A로 돌아 가지 않습니다. 빈 배경으로 돌아갑니다. Fragment-A로 돌아가려면 뒤로 버튼을 다시 한 번 클릭해야합니다.

그래서, 현재 조각이 완성되지 않은 것 같습니다.

Android의 뒤로 버튼과 같은 현재 조각을 완료하는 방법은 무엇입니까?


이것은 무엇입니까 MainActivity.addFragment(LocalFileBrowserFragment.this, fragment)??. 그에 따라 같은 backstak에 조각을 추가하고 팝업 필요
— Raghunandan

addFragment 함수에 조각을 추가했습니다.
— Wun

무엇과 활동 방법에 조각을 추가합니까 ??
— Raghunandan

2
getActivity (). onBackPressed (); 할 수 있습니다
— Viswanath Lekshmanan 2015 년

답변:


82

Fragment A에서 B로 이동하려면 A를 B로 바꾸고 addToBackstack()before를 사용하십시오 commit().

이제 Fragment B에서 C로 이동하려면 먼저 popBackStackImmediate()A를 사용합니다. 이제 첫 번째 트랜잭션과 마찬가지로 A를 C로 바꿉니다.


4
for usinf popStackImmediate () :-> getView (). setOnKeyListener (new View.OnKeyListener () {@Override public boolean onKey (View v, int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {getActivity () .getSupportFragmentManager (). popBackStackImmediate (); true를 반환합니다.} false를 반환합니다.}});
— Yash Agrawal 2016 년

131

나는 코드를 getActivity().getFragmentManager().beginTransaction().remove(this).commit();

...에

getActivity().getFragmentManager().popBackStack();

그리고 조각을 닫을 수 있습니다.


35
getActivity (). onBackPressed (); Thik 이것은 당신이 설명 한 것을 할 것입니다.
— Viswanath Lekshmanan

4
@ suomi35 아니. 당신이 onBackPressed를 오버라이드 (override) 할 필요하면 () 당신은 실현의 문제를 직면하게
— Le_Enot

작동하지 않는 것 같습니다. 2016에서는 setNavigationOnClickListener가 작동하지 않습니다.

1
@ViswanathLekshmanan 나는 이것이 댓글 대신 답변이어야한다고 생각합니다. 그리고 허용되는 답변도 있습니다.
— Francisco Romero

1
활동도 닫힙니다! 단편 닫기 만 필요합니다.
— Zon

70

간단한 방법을 찾아야하는 사람들을 위해

시험 getActivity().onBackPressed();


getActivity ()는 null이 될 수 있습니다.
— Arpit J.

1
@ArpitJ. onAttach ()가 호출되기 전에는 null 일 뿐이며 조각은 활동 없이는 살 수 없습니다.
— Tamim Attafi

@TamimAttafi True, 그러나 회전 또는 활동이 완료된 경우와 같은 경우를 언급했으며 어떤 이유로 인해 조각 인스턴스가 여전히 존재하면 null을 반환합니다.
— Arpit J.

popBackStack()및 popBackStackImmediate()버튼을 눌러 시뮬레이션을하지 않고 맨 위의 단편을 보여주고 더 직접적인 방법이 있습니다. onBackPressed()트리거 사용 OnBackPressedCallbacks; 나중에 뒤로 버튼 누름을 특별히 처리하려면 popBackStack()/ popBackStackImmediate()로 전환하여 프로그래밍 방식으로 콜백을 트리거하지 않도록해야합니다.
— Nolan Amy

이 코드를 Fragment의 버튼의 onclick 메서드에 넣습니다.
— Anon

6

getActivity().onBackPressed필요한 모든 것을 수행합니다. 부모 활동에서 onBackPressed 메서드를 자동으로 호출합니다 .


4

이 시도:

ft.addToBackStack(null);   // ft is FragmentTransaction

따라서 back-key 를 누르면 현재 활동 (여러 조각을 보유하고 있음)이 자체적으로 끝나지 않고 이전 조각을로드합니다.


4

이 논리는 저에게 효과적이기 때문에 시도해 볼 수 있습니다.

frag_profile profile_fragment = new frag_profile();

boolean flag = false;
@SuppressLint("ResourceType")
public void profile_Frag(){
    if (flag == false) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        manager.getBackStackEntryCount();
        transaction.setCustomAnimations(R.anim.transition_anim0, R.anim.transition_anim1);
        transaction.replace(R.id.parentPanel, profile_fragment, "FirstFragment");
        transaction.commit();
        flag = true;
    }

}

@Override
public void onBackPressed() {
    if (flag == true) {
        FragmentManager manager = getFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        manager.getBackStackEntryCount();
        transaction.remove(profile_fragment);
        transaction.commit();
        flag = false;
    }
    else super.onBackPressed();
}

4

이것은 Kotlin 방식으로 조각 레이아웃에 버튼을 만든 다음 onViewCreated에서 onClickListner를 설정했습니다.

@ Viswanath-Lekshmanan 코멘트에 따르면

override fun onViewCreated(view: View?, savedInstanceState: Bundle?) 
{
     super.onViewCreated(view, savedInstanceState)

     btn_FragSP_back.setOnClickListener {
        activity?.onBackPressed()
    }
}

이것은 조각이 아닌 활동을 닫습니다
— nibbana

3

이 시도:

public void removeFragment(Fragment fragment){
    android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager();
    android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    fragmentTransaction.remove(fragment);
    fragmentTransaction.commit();
}

3
Button ok= view.findViewById(R.id.btSettingOK);
Fragment me=this;
ok.setOnClickListener( new View.OnClickListener(){
    public void onClick(View v){
     getActivity().getFragmentManager().beginTransaction().remove(me).commit();
    }
});

3
이 코드가 질문에 답할 수는 있지만이 코드가 질문에 대한 답변 이유 및 / 또는 방법에 대한 추가 컨텍스트를 제공하면 장기적인 가치가 향상됩니다.
— rollstuhlfahrer

이 간단한 코드는 실제로 현재 조각보기를 확인 또는 닫기 버튼으로 제거합니다. 조각으로 표시된 조명 설정 패널을 종료하고 활동으로 돌아갑니다. 이 트릭에 대해 죄송하지만 Android 8에서는 여러 Fragment를 관리하는 것이 그렇게 실용적이지 않다고 생각합니다.
— Bruno L.

1

뒤로 버튼을 사용하여 작업을보다 구체적으로 처리해야하는 경우 다음 방법을 사용할 수 있습니다.

view.setFocusableInTouchMode(true);
view.requestFocus();
view.setOnKeyListener(new View.OnKeyListener() {
    @Override
    public boolean onKey(View v, int keyCode, KeyEvent event) {
        if( keyCode == KeyEvent.KEYCODE_BACK )
        {
            onCloseFragment();
            return true;
        } else {
            return false;
        }
    }
});

0

프래그먼트에서을 onCreateView(...)호출하여 뷰를 제거 할 수 있습니다 container.removeView(view);. 당신이 조각을 제거하려면, 다음 그래서 view의 반환 값이어야한다 onCreateView,

예를 들면

    public View onCreateView(...){
        final View view = inflater.inflate(R.layout.your_fragments_layout,container,false);
        //Do something
        finishButton.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                container.removeView(view);
            }
        });
        return view;
    }

-7

이걸로 해봐

getActivity().finish();

1
그래서 영업 이익과 다른 사람에 대한 쉬운 앞으로이 질문에 돌아 오는 대답은 이해하는 것이 더 답을 설명하는 시도
— 아만 CHHABRA

7
이것은 조각이 아닌 전체 활동을 닫습니다
— busuu

그것은 나를 도왔다. 더 많은 정보를 원하는 사람들은 그것을 google. 여기에 공식 문서를 복사 할 필요가 없습니다.
— Alesha170

일반적으로 하나의 활동이있는 BottomNavigationView를 사용하는 경우이 명령은 이전 조각으로 돌아가는 대신 앱을 닫습니다.
— Aliton Oliveira 19.11.29
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.