힝구힝구
233
2020-11-23 10:43:50 작성 2020-11-23 10:44:40 수정됨
2
356

fragment와 activity간 데이터 초기화에 관한 질문입니다.


안녕하세요, 항상 오키에서 양질의 답변 얻어가서 감사드립니다.

다름아니라 지금 개발중인 프로젝트에 궁금한 점이 있습니다.

이런식으로 네이버 뉴스 기사를 넣으면..


댓글에 관한 이런저런 정보를 뽑아내주는 앱입니다. (그냥 참고로만 봐주세요)


해당 결과 화면은 tablayout과 4개의 fragment로 이루어진 viewpager입니다.

이제 여기서 뒤로가기를 눌러서 링크에 새로운 기사를 다시 입력을 하면..

기존의 정보들이 그대로 나옵니다. 그런데 '키워드클라우드' 랑 '비슷한 기사'는 갱신이됩니다;;


이 문제 관련해서 뭔가 생명주기에 관한 공부가 필요한거같아서 fragment, activity의 생명주기에 관한것을 찾아봤는데, onResume, onPause, onDestoryview 이런곳에서 작업을 해야 할 것 같긴 합니다만, 관련한 예제를 찾지 못해서 부득이하게 질문올리게 됐습니다.

간단하게 데이터의 인과관계는 다음과 같습니다.

먼저 MainActivity에서 데이터를 가져와서, resultIntent라는intent에 넣어줍니다.

//결과값 넘겨줄 Intent 선언
Intent resultIntent;

그 후, asynctask를 통해서 서버로부터 받은 값들을 arraylist<hashmap> 형태로 넣어주고, 결과화면인 resultActivity를 실행시킵니다.



public class GETAsyncTask extends AsyncTask<String, Void, String>{
ProgressDialog progressDialog;

@Override
protected void onPostExecute(String s) {
JsonParsing();

startActivity(resultIntent);
super.onPostExecute(s);
} ... }

ResultActivity에서 넘겨받은 값들을 사용해서 viewpager와 fragment를 설정시켜줍니다.

public class ResultActivity extends AppCompatActivity {

private ViewPager mViewPager;
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());

ArrayList<HashMap<String, String>> tnewsArrayList;
ArrayList<HashMap<String, String>> timeAnalysisArrayList;
ArrayList<HashMap<String, String>> relevantArticleArrayList;
ArrayList<HashMap<String, String>> keywordRankArrayList;
ArrayList<HashMap<String, String>> emotionAnalysisArrayList;
ArrayList<HashMap<String, String>> emotionCommentsArrayList;

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_result);

HashMap<String,String> hashMap = new HashMap<>();

Intent intent = getIntent();
tnewsArrayList = (ArrayList<HashMap<String, String>>) intent.getSerializableExtra("tnews");
timeAnalysisArrayList = (ArrayList<HashMap<String, String>>) intent.getSerializableExtra("timeAnalysis");
relevantArticleArrayList = (ArrayList<HashMap<String, String>>) intent.getSerializableExtra("relevantArticle");
keywordRankArrayList = (ArrayList<HashMap<String, String>>) intent.getSerializableExtra("keywordRank");
emotionAnalysisArrayList = (ArrayList<HashMap<String, String>>) intent.getSerializableExtra("emotionAnalysis");
emotionCommentsArrayList = (ArrayList<HashMap<String, String>>) intent.getSerializableExtra("emotionComments");

TextView newsTitle = findViewById(R.id.articleTitle);
newsTitle.setText(emotionAnalysisArrayList.get(0).get("title"));
//워드클라우드 이미지 따로 받아오기
String wordcloud = getIntent().getStringExtra("wordcloud");
hashMap.put("wordcloud", wordcloud);
keywordRankArrayList.add(hashMap);

hashMap = new HashMap<>();
hashMap.put("flag","true");
String simArticleImg1 = getIntent().getStringExtra("simArticleImg1");
hashMap.put("simArticleImg1", simArticleImg1);
String simArticleImg2 = getIntent().getStringExtra("simArticleImg2");
hashMap.put("simArticleImg2", simArticleImg2);
String simArticleImg3 = getIntent().getStringExtra("simArticleImg3");
hashMap.put("simArticleImg3", simArticleImg3);

relevantArticleArrayList.add(hashMap);

mViewPager = findViewById(R.id.layout_viewPager);
setupViewPager(mViewPager);

TabLayout tabLayout = findViewById(R.id.layout_tab);
tabLayout.setupWithViewPager(mViewPager);

}

public void setupViewPager(ViewPager viewPager) {

Fragment fragmentTotal = new FragmentTotal();
Fragment fragmentKeyword = new FragmentKeyword();
Fragment fragmentEmotion = new FragmentEmotion();
Fragment fragmentEtc = new FragmentEtc();

//프래그먼트로 넘겨줄 arraylist친구들
Bundle bundle = new Bundle();
bundle.putSerializable("tnewsArrayList", tnewsArrayList);
bundle.putSerializable("timeAnalysisArrayList", timeAnalysisArrayList);
bundle.putSerializable("relevantArticleArrayList", relevantArticleArrayList);
bundle.putSerializable("keywordRankArrayList", keywordRankArrayList);
bundle.putSerializable("emotionAnalysisArrayList", emotionAnalysisArrayList);
bundle.putSerializable("emotionCommentsArrayList", emotionCommentsArrayList);

fragmentTotal.setArguments(bundle);
fragmentKeyword.setArguments(bundle);
fragmentEmotion.setArguments(bundle);
fragmentEtc.setArguments(bundle);

adapter.addFragment(fragmentTotal, "종합");
adapter.addFragment(fragmentKeyword, "키워드 분석");
adapter.addFragment(fragmentEmotion, "감정 분석");
adapter.addFragment(fragmentEtc, "기타 정보");

viewPager.setAdapter(adapter);
}
}

그러면 fragment쪽에서는 요런식으로 표현이 되는 매커니즘입니다.

가독성 편의상 '종합 정보' 탭에 해당하는 fragment 하나만 올리겠습니다.

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_total, container, false);

Bundle bundle = getArguments();

tnewsArrayList = (ArrayList<HashMap>) bundle.getSerializable("tnewsArrayList");
timeAnalysisArrayList = (ArrayList<HashMap>) bundle.getSerializable("timeAnalysisArrayList");

sexRateChart(view);
ageRateChart(view);
timeLineChart(view);

return view;
}

이제 여기서 뒤로가기를 했을 때.. 데이터 flush 처리를 어떻게 해야될 지 모르겠습니다 ㅠㅠ..

뭐 onPause, onStop, onDestroyview 이런것중 뭘 써야되는지, 그 안에서 fragment 데이터를 어떻게 초기화를 시켜야 하는지 좀 알려주시면 감사하겠습니다.


0