안드로이드 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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)