210202
뷰페이저(ViewPager) FragmentStatePagerAdapter로 구현하기 + 특정 프래그먼트에 도달하면 다이얼로그 띄워주기 본문
Android
뷰페이저(ViewPager) FragmentStatePagerAdapter로 구현하기 + 특정 프래그먼트에 도달하면 다이얼로그 띄워주기
dev210202 2020. 2. 20. 16:33아래 사이트를 참고해서 기능을 구현했다.
예제랑은 거의 비슷하게 짰는데 다른점은 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를 사용해서 다이얼로그를 열 수 있게 처리했다.
실행결과
'Android' 카테고리의 다른 글
T Map API 다중마커 구현 + 풍선뷰 이벤트 처리(풍선뷰 누를 시 마커삭제) (0) | 2020.02.24 |
---|---|
Retrofit을 사용한 서버통신(jsonplaceholder 사이트 사용) (0) | 2020.02.22 |
프로그레스 다이얼로그 구현 (0) | 2020.02.20 |
실행 딜레이 처리 (0) | 2020.02.20 |
Floating EditText 구현 (0) | 2020.02.20 |
Comments