210202

뷰페이저(ViewPager) FragmentStatePagerAdapter로 구현하기 + 특정 프래그먼트에 도달하면 다이얼로그 띄워주기 본문

Android

뷰페이저(ViewPager) FragmentStatePagerAdapter로 구현하기 + 특정 프래그먼트에 도달하면 다이얼로그 띄워주기

dev210202 2020. 2. 20. 16:33

아래 사이트를 참고해서 기능을 구현했다.

https://itpangpang.xyz/284

 

ViewPager 완전정복(일단 만들기)

ViewPager 완전정복 (일단 만들기) ㆍ 이번글을 시작으로 ViewPager에 대해 써보려고 합니다. ㆍ ViewPager에 대해서 완벽하게 알지는 못하지만.. 완벽하게 알기 위해서 분석하면서 글을 써보려합니다. ㆍ 이번글..

itpangpang.xyz

예제랑은 거의 비슷하게 짰는데 다른점은 5개의 프래그먼트를 이용한다는 점, 5번째 프래그먼트에 도달하면 다이얼로그 창이 뜨게 했다는 점이다.

 

ViewPagerTestActivity.java

public class ViewpagerTestActivity extends AppCompatActivity {
    public static ViewPager mViewPager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_viewpager_test);
        mViewPager = (ViewPager) findViewById(R.id.viewpager);
        mViewPager.setAdapter(new pagerAdapter(getSupportFragmentManager()));
        mViewPager.setCurrentItem(0);
        View.OnClickListener movePageListener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int tag = (int)v.getTag();
                mViewPager.setCurrentItem(tag);
            }
        };
    }

    private class pagerAdapter extends FragmentStatePagerAdapter {
        public pagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            switch (position) {
                case 0:
                    return new TabFragment1();
                case 1:
                    return new TabFragment2();
                case 2:
                    return new TabFragment3();
                case 3:
                    return new TabFragment4();
                case 4:
                    return new TabFragment5();
                default:
                    return null;
            }
        }

        @Override
        public int getCount() {
            return 5;
        }
    }
}

PagerAdapter.java

public class PagerAdapter extends FragmentStatePagerAdapter {
    int mNumOfTabs;

    public PagerAdapter(FragmentManager fm, int NumOfTabs) {
        super(fm);
        this.mNumOfTabs = NumOfTabs;
    }

    @Override
    public Fragment getItem(int position) {

        switch (position) {
            case 0:
                TabFragment1 tab1 = new TabFragment1();
                return tab1;
            case 1:
                TabFragment2 tab2 = new TabFragment2();
                return tab2;
            case 2:
                TabFragment3 tab3 = new TabFragment3();
                return tab3;
            case 3:
                TabFragment4 tab4 = new TabFragment4();
                return tab4;
            case 4:
                TabFragment5 tab5 = new TabFragment5();
                return tab5;
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return mNumOfTabs;
    }
}

TabFragment5.java

import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;

import androidx.fragment.app.Fragment;

import com.bumptech.glide.Glide;

import org.first.meeatnow.MapActivity;
import org.first.meeatnow.R;

import static org.first.meeatnow.ViewpagerTestActivity.mViewPager;

public class TabFragment5 extends Fragment {
    boolean isOpenDialog = false;
    private ImageView imageView;
    public TabFragment5() {
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if(isOpenDialog) {
            Handler mHandler = new Handler();
            mHandler.postDelayed(new Runnable()  {
                public void run() {
                    showDialog();
                }
            }, 2000); // 2초후
        }
        else{

        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.tab_fragment5, container, false);
        imageView = view.findViewById(R.id.GlideImage5_imageview);
        String url = "https://cdn.dominos.co.kr/admin/upload/goods/20200119_Dzj9GV1R.jpg";
        Glide.with(this).load(url).centerInside().fitCenter()
                .error(R.drawable.ic_launcher_background)
                .into(imageView);
        return view;
    }

    @Override
    public void onResume() {
        super.onResume();
        Handler mHandler = new Handler();
        mHandler.postDelayed(new Runnable()  {
            public void run() {
                showDialog();
            }
        }, 1000); // 2초후

    }
    private void showDialog(){
        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
        builder.setTitle("주변 음식점 찾기");
        builder.setMessage("주변에 음식점을 찾고\n"
                + "같이 먹을 사람을 찾아보시겠어요?");
        builder.setCancelable(true);
        builder.setPositiveButton("네!", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                Intent intent = new Intent(getContext(), MapActivity.class);
                startActivity(intent);
            }
        });
        builder.setNegativeButton("아니요", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int id) {
                mViewPager.setCurrentItem(0);
            }
        });
        builder.create().show();
    }

    @Override
    public void onPause() {
        super.onPause();
        isOpenDialog = true;
    }
}

5번째 프래그먼트에 도달할때마다 다이얼로그를 띄우는 방법은 프래그먼트의 생명주기를 알아야한다.

https://developer88.tistory.com/69이 사이트를 참고하길 바란다.

사용자가 5번째 프래그먼트에 도달하게 되면 onCreate -> onCreateView -> ~~~ -> onResume 순으로 진행된다. 그 후 다른 프래그먼트로 이동하게 되면 onPause상태가 된다. 그리고 다시 실행하게되면 onPause -> onCreate로 진행된다.

만약에 우리가 onCreateView에서 바로 다이얼로그를 띄우게 되면 view를 리턴하기전에 다이얼로그가 나와서 원하는 결과가 안나오게 된다. 따라서 onPause상태에서 view가 띄워진 후 딜레이를 통해서 다이얼로그를 띄워준다. 

그리고 다른 프래그먼트에서 다시 5번째 프레그먼트로 왔을때처리를 위해서 onPause일때(다른 프로그래스로 넘어갈때) isOpenDialog를 사용해서 5번째 프래그먼트로 다시 오면 view가 이미 있는 상태이기때문에 onCreate에서 isOpenDialog를 사용해서 다이얼로그를 열 수 있게 처리했다.

 

실행결과

실행결과

Comments