尝试替换片段时出错,片段事务中的活动已销毁

nuypyhwy  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(288)

我试图用另一个片段替换我当前的片段,当我在一个可解释视图中单击一个图像时,当我单击该图像时,应用程序崩溃,并且logcat说这是由于活动被破坏而导致的。
主活动.java

  1. public class MainActivity extends FragmentActivity {
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. setContentView(R.layout.activity_main);
  6. // Check that the activity is using the layout version with
  7. // the fragment_container FrameLayout
  8. if (findViewById(R.id.fragment_container) != null) {
  9. // However, if we're being restored from a previous state,
  10. // then we don't need to do anything and should return or else
  11. // we could end up with overlapping fragments.
  12. if (savedInstanceState != null) {
  13. return;
  14. }
  15. // Create a new Fragment to be placed in the activity layout
  16. QuestionsFragment firstFragment = new QuestionsFragment();
  17. // In case this activity was started with special instructions from an
  18. // Intent, pass the Intent's extras to the fragment as arguments
  19. firstFragment.setArguments(getIntent().getExtras());
  20. // Add the fragment to the 'fragment_container' FrameLayout
  21. getFragmentManager().beginTransaction()
  22. .add(R.id.fragment_container, firstFragment).commit();
  23. }
  24. }
  25. public void thanksFragment(){
  26. //Adicionando código responsável pela transição do
  27. //Fragmento para tela de agradecimento
  28. ThanksFragment thanks = new ThanksFragment();
  29. FragmentTransaction transaction = getFragmentManager().beginTransaction();
  30. // Replace whatever is in the fragment_container view with this fragment,
  31. // and add the transaction to the back stack if needed
  32. transaction.replace(R.id.fragment_container, thanks);
  33. transaction.addToBackStack(null);
  34. // Commit the transaction
  35. transaction.commit();
  36. }
  37. }

问题碎片.java

  1. public class QuestionsFragment extends Fragment{
  2. MyExpandableListAdapter listAdapter;
  3. ExpandableListView expListView;
  4. List<String> listDataHeader;
  5. HashMap<String, Emoticons> listDataChild;
  6. //private ArrayAdapter<String> mQuestionAdapter;
  7. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  8. Bundle savedInstanceState) {
  9. View rootView = inflater.inflate(R.layout.questions_fragment, container, false);
  10. //Get the ListView
  11. expListView = (ExpandableListView) rootView.findViewById(R.id.list_view);
  12. //Prepare ListData
  13. prepareListData();
  14. listAdapter = new MyExpandableListAdapter(QuestionsFragment.this.getActivity().getApplicationContext(), listDataHeader, listDataChild);
  15. expListView.setAdapter(listAdapter);
  16. // Inflate the layout for this fragment
  17. return rootView;
  18. }
  19. /*
  20. * Preparing the list data
  21. */
  22. public void prepareListData() {
  23. listDataHeader = new ArrayList<String>();
  24. listDataChild = new HashMap<String, Emoticons>();
  25. // Adding child data
  26. listDataHeader.add("Rapidez e Eficiência no Check in:");
  27. listDataHeader.add("Rapidez e Eficiência no Check out:");
  28. listDataHeader.add("Cordialidade:");
  29. listDataHeader.add("Limpeza do Apartamento:");
  30. listDataHeader.add("Conforto do Apartamento:");
  31. listDataHeader.add("Artigos de Banho:");
  32. listDataHeader.add("Café da Manha:");
  33. listDataHeader.add("Refeições:");
  34. listDataHeader.add("Serviços de Internet:");
  35. listDataHeader.add("Serviços de Estacionamento:");
  36. // Adding child data
  37. listDataChild.put(listDataHeader.get(0), new Emoticons());
  38. listDataChild.put(listDataHeader.get(1),new Emoticons());
  39. listDataChild.put(listDataHeader.get(2),new Emoticons());
  40. listDataChild.put(listDataHeader.get(3),new Emoticons());
  41. listDataChild.put(listDataHeader.get(4),new Emoticons());
  42. listDataChild.put(listDataHeader.get(5),new Emoticons());
  43. listDataChild.put(listDataHeader.get(6),new Emoticons());
  44. listDataChild.put(listDataHeader.get(7),new Emoticons());
  45. listDataChild.put(listDataHeader.get(8),new Emoticons());
  46. listDataChild.put(listDataHeader.get(9),new Emoticons());
  47. }
  48. }

myexpandablelistadapter.java文件

  1. public class MyExpandableListAdapter extends BaseExpandableListAdapter {
  2. private static int img1;
  3. private static int img2;
  4. private static int img3;
  5. private static int img4;
  6. private static int img5;
  7. private Context _context;
  8. private List<String> _listDataHeader; // header titles
  9. // child data in format of header title, child title
  10. private HashMap<String, Emoticons> _listDataChild;
  11. public MyExpandableListAdapter(Context context, List<String> listDataHeader,
  12. HashMap<String, Emoticons> listChildData) {
  13. this._context = context;
  14. this._listDataHeader = listDataHeader;
  15. this._listDataChild = listChildData;
  16. }
  17. public long getChildId(int groupPosition, int childPosition) {
  18. return childPosition;
  19. }
  20. public View getChildView(int groupPosition, final int childPosition,
  21. boolean isLastChild, View convertView, ViewGroup parent) {
  22. if (convertView == null) {
  23. LayoutInflater infalInflater = (LayoutInflater) this._context
  24. .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  25. convertView = infalInflater.inflate(R.layout.emoticons_question_list_item, null);
  26. }
  27. //Linha Importante, pois instancio um objeto que receberá o valor do Objeto armazenado no HashMap
  28. final Emoticons getQuestionEmoticons = (Emoticons)_listDataChild.get(_listDataHeader.get(groupPosition));
  29. final ImageView imgBad = (ImageView) convertView.findViewById(R.id.image_bad);
  30. imgBad.setImageResource(getQuestionEmoticons.getImgBad());
  31. final ImageView imgBad2 = (ImageView) convertView.findViewById(R.id.image_bad2);
  32. imgBad2.setImageResource(getQuestionEmoticons.getImgBad2());
  33. final ImageView imgNormal = (ImageView) convertView.findViewById(R.id.image_normal);
  34. imgNormal.setImageResource(getQuestionEmoticons.getImgNormal());
  35. final ImageView imgGood = (ImageView) convertView.findViewById(R.id.image_good);
  36. imgGood.setImageResource(getQuestionEmoticons.getImgGood());
  37. final ImageView imgExcelent = (ImageView) convertView.findViewById(R.id.image_excelent);
  38. imgExcelent.setImageResource(getQuestionEmoticons.getImgExcelent());
  39. //Aqui foram adicionados os listners
  40. imgBad.setClickable(true);
  41. imgBad.setOnClickListener(new View.OnClickListener() {
  42. @Override
  43. public void onClick(View v) {
  44. getQuestionEmoticons.changeEmoticons(1);
  45. imgBad.setImageResource(getQuestionEmoticons.getImgBad());
  46. imgBad2.setImageResource(getQuestionEmoticons.getImgBad2());
  47. imgNormal.setImageResource(getQuestionEmoticons.getImgNormal());
  48. imgGood.setImageResource(getQuestionEmoticons.getImgGood());
  49. imgExcelent.setImageResource(getQuestionEmoticons.getImgExcelent());
  50. MainActivity main = new MainActivity();
  51. main.thanksFragment();
  52. }
  53. });
  54. imgBad2.setClickable(true);
  55. imgBad2.setOnClickListener(new View.OnClickListener() {
  56. @Override
  57. public void onClick(View v) {
  58. getQuestionEmoticons.changeEmoticons(2);
  59. imgBad.setImageResource(getQuestionEmoticons.getImgBad());
  60. imgBad2.setImageResource(getQuestionEmoticons.getImgBad2());
  61. imgNormal.setImageResource(getQuestionEmoticons.getImgNormal());
  62. imgGood.setImageResource(getQuestionEmoticons.getImgGood());
  63. imgExcelent.setImageResource(getQuestionEmoticons.getImgExcelent());
  64. }
  65. });
  66. imgNormal.setClickable(true);
  67. imgNormal.setOnClickListener(new View.OnClickListener() {
  68. @Override
  69. public void onClick(View v) {
  70. getQuestionEmoticons.changeEmoticons(3);
  71. imgBad.setImageResource(getQuestionEmoticons.getImgBad());
  72. imgBad2.setImageResource(getQuestionEmoticons.getImgBad2());
  73. imgNormal.setImageResource(getQuestionEmoticons.getImgNormal());
  74. imgGood.setImageResource(getQuestionEmoticons.getImgGood());
  75. imgExcelent.setImageResource(getQuestionEmoticons.getImgExcelent());
  76. }
  77. });
  78. imgGood.setClickable(true);
  79. imgGood.setOnClickListener(new View.OnClickListener() {
  80. @Override
  81. public void onClick(View v) {
  82. getQuestionEmoticons.changeEmoticons(4);
  83. imgBad.setImageResource(getQuestionEmoticons.getImgBad());
  84. imgBad2.setImageResource(getQuestionEmoticons.getImgBad2());
  85. imgNormal.setImageResource(getQuestionEmoticons.getImgNormal());
  86. imgGood.setImageResource(getQuestionEmoticons.getImgGood());
  87. imgExcelent.setImageResource(getQuestionEmoticons.getImgExcelent());
  88. }
  89. });
  90. imgExcelent.setClickable(true);
  91. imgExcelent.setOnClickListener(new View.OnClickListener() {
  92. @Override
  93. public void onClick(View v) {
  94. getQuestionEmoticons.changeEmoticons(5);
  95. imgBad.setImageResource(getQuestionEmoticons.getImgBad());
  96. imgBad2.setImageResource(getQuestionEmoticons.getImgBad2());
  97. imgNormal.setImageResource(getQuestionEmoticons.getImgNormal());
  98. imgGood.setImageResource(getQuestionEmoticons.getImgGood());
  99. imgExcelent.setImageResource(getQuestionEmoticons.getImgExcelent());
  100. }
  101. });
  102. return convertView;
  103. }
  104. public Object getGroup(int groupPosition) {
  105. return this._listDataHeader.get(groupPosition);
  106. }
  107. @Override
  108. public Object getChild(int groupPosition, int childPosition) {
  109. return null;
  110. }
  111. public int getGroupCount() {
  112. return this._listDataHeader.size();
  113. }
  114. @Override
  115. public int getChildrenCount(int groupPosition) {
  116. return 1;
  117. }
  118. public long getGroupId(int groupPosition) {
  119. return groupPosition;
  120. }
  121. public View getGroupView(int groupPosition, boolean isExpanded,
  122. View convertView, ViewGroup parent) {
  123. String headerTitle = (String) getGroup(groupPosition);
  124. if (convertView == null) {
  125. LayoutInflater infalInflater = (LayoutInflater) this._context
  126. .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  127. convertView = infalInflater.inflate(R.layout.question_list_item, null);
  128. }
  129. TextView txtListGroup = (TextView) convertView
  130. .findViewById(R.id.question_list_item_textview);
  131. txtListGroup.setText(headerTitle);
  132. return convertView;
  133. }
  134. public boolean hasStableIds() {
  135. return false;
  136. }
  137. public boolean isChildSelectable(int groupPosition, int childPosition) {
  138. return true;
  139. }
  140. }

我得到的错误是:

  1. FATAL EXCEPTION: main
  2. Process: br.ind.uptech.princessfeedback, PID: 6631
  3. java.lang.IllegalStateException: Activity has been destroyed
  4. at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1365)
  5. at android.app.BackStackRecord.commitInternal(BackStackRecord.java:729)
  6. at android.app.BackStackRecord.commit(BackStackRecord.java:705)
  7. at br.ind.uptech.princessfeedback.MainActivity.thanksFragment(MainActivity.java:54)
  8. at
  9. br.ind.uptech.princessfeedback.MyExpandableListAdapter$1.onClick(MyExpandableListAdapter.java:96)
  10. at android.view.View.performClick(View.java:5242)
  11. at android.view.View$PerformClick.run(View.java:21156)
  12. at android.os.Handler.handleCallback(Handler.java:739)
  13. at android.os.Handler.dispatchMessage(Handler.java:95)
  14. at android.os.Looper.loop(Looper.java:145)
  15. at android.app.ActivityThread.main(ActivityThread.java:6862)
  16. at java.lang.reflect.Method.invoke(Native Method)
  17. at java.lang.reflect.Method.invoke(Method.java:372)
  18. at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1404)
  19. at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1199)

非常感谢!

osh3o9ms

osh3o9ms1#

我想问题就在这里。你不应该自己动手。如果要从myexpandablelistadapter调用mainactivity中的方法,可以将活动引用传递给它。为了安全起见,您可以在questionsfragment中使用回调。

  1. //Aqui foram adicionados os listners
  2. imgBad.setClickable(true);
  3. imgBad.setOnClickListener(new View.OnClickListener() {
  4. @Override
  5. public void onClick(View v) {
  6. getQuestionEmoticons.changeEmoticons(1);
  7. imgBad.setImageResource(getQuestionEmoticons.getImgBad());
  8. imgBad2.setImageResource(getQuestionEmoticons.getImgBad2());
  9. imgNormal.setImageResource(getQuestionEmoticons.getImgNormal());
  10. imgGood.setImageResource(getQuestionEmoticons.getImgGood());
  11. imgExcelent.setImageResource(getQuestionEmoticons.getImgExcelent());
  12. MainActivity main = new MainActivity();
  13. main.thanksFragment();
  14. }
  15. });
展开查看全部

相关问题