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


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.