안드로이드 fragment 질문드려요~~!!
조회수 896회
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener, FragmentCallback{
navFragment1 navFrag1;
navFragment2 navFrag2;
navFragment3 navFrag3;
ViewPager viewPager;
Toolbar toolbar;
MovieFragment fragment4;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.addDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
navFrag1 = new navFragment1();
navFrag2 = new navFragment2();
navFrag3 = new navFragment3();
viewPager = new ViewPager();
fragment4 = new MovieFragment();
getSupportFragmentManager().beginTransaction().add(R.id.container, viewPager).commit();
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public void onFragmentChanged(int index) {
Fragment curFragment = null;
if (index == 0) {
curFragment = navFrag1;
toolbar.setTitle("첫번째 네비");
} else if (index == 1) {
curFragment = navFrag2;
toolbar.setTitle("두번째 네비");
} else if (index == 2) {
curFragment = navFrag3;
toolbar.setTitle("세번째 네비");
} else if (index == 3) {
curFragment = fragment4;
}
getSupportFragmentManager().beginTransaction().replace(R.id.container, curFragment).addToBackStack(null).commit();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.nav_0) {
onFragmentChanged(0);
} else if (id == R.id.nav_1) {
onFragmentChanged(1);
} else if (id == R.id.nav_2) {
onFragmentChanged(2);
}
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
}
=================================================================================
public class ViewPager extends Fragment{
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.viewpager1, container, false);
Button button = rootView.findViewById(R.id.button1);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
return rootView;
}
}
Viewpager프래그먼트에서 Button을 클릭하면 MovieFragment로 변경하려구 어떤 방식으로 접근 해야 할까요~? 그리구 navFragment에서 back버튼을 누르면 앱이 종료되어버립니다....
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
음.. 일단 addToBackStack() 을 적용했는데도 navFragment 로 replace 된 상태에서 backkey 를 누르면 ViewPager fragment 로 돌아가지 않고 앱이 종료 된다고 하시는건 좀 이상하네요; 일단 MovieFragment 로 변경하는 것은 아래와 같이 처리하시면 될 것 같습니다.
Activity 에 MovieFragment 로 replace 하는 메소드 작성
public void replaceMoveFragment(){ getSupportFragmentManager().beginTransaction().replace(R.id.container, fragment4).addToBackStack(null).commit(); }
ViewPager fragment 의 OnClick()
button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ((MainActivity)getActivity()).replaceMovieFragment(); } });
-
(•́ ✖ •̀)
알 수 없는 사용자
- 감사합니다!! 저두 addToBackStack()을 적용했는데두 불구하고 계속 앱이 종료되어서 한참 고민하고있습니다 ㅠㅠ 다른문제가 있는지 저두 한번 더 확인해볼게요 감사드립니다!! 알 수 없는 사용자 2018.7.17 08:03
- 그리구 onFragmentChanged index를 넘겨주는건 어떻게 생각하시나요!? onattach에 getactivity해봐도 null오류가 나구 ((MainActivity)getActivity()).onFragmentChanged (4); 이런방식으로 oncreateView에 해도 null 오류가 났었어요... 답변자님이 주신 방식으로도 해보겠습니다. 알 수 없는 사용자 2018.7.17 08:05
- 어제는 안됬는데 오늘은 또 backstack이 잘 작동하네요... 어떤 현상인지 잘 모르겠지만 잘 작동합니가 감사합니다~ 알 수 없는 사용자 2018.7.17 08:09
- 네 메소드는 임의로 사용하셔도 됩니다. 그리고 getActivity() 는 onActivityCreated() 시점 이후부터 사용하셔야 합니다. 알 수 없는 사용자 2018.7.17 10:33
-
댓글 입력