마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 프래그먼트 내용 유지에 대해 질문합니다.

0 추천

MainActivity 코드입니다.

    public class MainActivity extends AppCompatActivity implements OnColorButtonListener {

        @Override

        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
  

        @Override
        public void onColorClick(int color) {
            Fragment fragment = null;
            switch (color) {
                case 0:
                    fragment = new RedFragment();
                    break;

                case 1:
                    fragment = new BlueFragment();
                    break;

            }

             getSupportFragmentManager().beginTransaction()
                    .replace(R.id.fragment_ex, fragment).commit();
        }
    }


RedFragment 코드입니다.

    public class RedFragment extends Fragment implements FlowerAdapter.FlowerClickListener {

        private SwipeRefreshLayout swipeContainer_red;
        private RecyclerView mRecyclerView;
        private RestManager mRestManager;
        private FlowerAdapter mFlowerAdapter;
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

            View view = inflater.inflate(R.layout.fragment_red, null);
            swipeContainer_red = (SwipeRefreshLayout) view.findViewById(R.id.swipeContainer_red);
            swipeContainer_red.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {

                @Override
                public void onRefresh() {
                    mRestManager = new RestManager();
                    Call<List<Flower>> listCall = mRestManager.getmFlowerApiService(getActivity()).getAllFlowers();
                    listCall.enqueue(new Callback<List<Flower>>() {
                        @Override
                        public void onResponse(Call<List<Flower>> call, Response<List<Flower>> response) {

                            if (response.isSuccessful()) {
                                mFlowerAdapter.clear();
                                List<Flower> flowerList = response.body();
                                for(int i =0; i<flowerList.size(); i++) {
                                    Flower flower = flowerList.get(i);
                                    mFlowerAdapter.addFlower(flower);
                                }
                                swipeContainer_red.setRefreshing(false);
                            }
                        }

                        @Override
                        public void onFailure(Call<List<Flower>> call, Throwable t) {
                        }
                    });

                }
            });
            configViews(view);

            return view;
        }

        private void configViews(View view) {
            mRecyclerView = (RecyclerView) view.findViewById(R.id.rv_flower_red);
            mRecyclerView.setHasFixedSize(true);
            mRecyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool());
            mRecyclerView.setLayoutManager(new GridLayoutManager(getActivity().getApplicationContext(), 3));
            mFlowerAdapter = new FlowerAdapter(this);
            mRecyclerView.setAdapter(mFlowerAdapter);
        }

        @Override

        public void onClick(int position) {
        }
    }

버튼클릭과 관련된 RowFragment.java 입니다

    public class RowFragment extends Fragment implements View.OnClickListener {
    
        private OnColorButtonListener onColorButtonListener;
        public RowFragment() {
        }
        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            onColorButtonListener = (OnColorButtonListener) context;
        }
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View view = inflater.inflate(R.layout.fragment_row, container, false);
            view.findViewById(R.id.v_red).setOnClickListener(this);
            view.findViewById(R.id.v_blue).setOnClickListener(this);
            return view;
        }
    
        @Override
        public void onClick(View view) {
    
            switch (view.getId()) {
                case R.id.v_red:
                    onColorButtonListener.onColorClick(0);
                    break;
    
                case R.id.v_blue:
                    onColorButtonListener.onColorClick(1);
                    break;
            }

 
거의 다 제대로 동작하는데 제가 원하는 것은 레드프래그먼트에서 데이터를 불러온 후에 다른 프래그먼트로 이동했다가 다시 레드프래그먼트로 돌아오더라도 새롭게 리셋되지 않고 그대로 레드 프래그먼트가 유지되는 것입니다. 지금은 제꺼 화면이 이렇습니다.

여기서 아래 노란 탭을 눌러서 동작하다가  빨간탭을 누른 후에 다시 노란탭으로 돌아오면 노란탭이 리셋되어있습니다. 어떻게 리셋되지 않게 할수있나요? 끌어서 새로고침 기능을 넣어서 그걸로면 새로고침되면 충분하기에 저렇게 자동으로 리셋되는 걸 막고싶습니다. 도와주시면 감사하겠습니다.

 

OnColorButtonListener 는 이렇습니다.

 

public interface OnColorButtonListener {
    void onColorClick(int color);
}


혹시 필요한 정보 있으시다면 올리도록하겠습니다. 도와주세요..

 

해쉬코드에 올리고 오키에도 올렸지만 여기에도 올려봅니다.

 

제가 초보라 이런 쉬운 거 질문해서 죄송합니다.. 도와주세요.

 

메인에스카캐 (200 포인트) 님이 2016년 9월 20일 질문

1개의 답변

+1 추천
 
채택된 답변
애초에 설계가 새로 생성하게 되어있습니다

onColorClick에 보시면 항상 new를 하게되어 있네요

각 fragment instance를 main activity에서 가지고 계시고 null일 경우만 새로 생성해서 해보세요

혹은, viewpager를 이용해서 viewpager의 adapter가 FragmentStatePagerAdapter를 상속하도록 구현해 보시는 것도 좋습니다
prague (26,200 포인트) 님이 2016년 9월 20일 답변
메인에스카캐님이 2016년 9월 20일 채택됨
확인해보겠습니다. 감사합니다.
...