android – 清除并重新创建视图时,Scrollview和OnClick处理程序无法正常工作

前端之家收集整理的这篇文章主要介绍了android – 清除并重新创建视图时,Scrollview和OnClick处理程序无法正常工作前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个奇怪的问题,我不知道问题出在哪里.

我有一个XML文件,其中包含两个线性布局,根据使用的设置,一次只能看到一个.两个视图都是动态生成的,并设置了一个on click listener和onlongclicklistener.

以下是XML布局:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="wrap_content"
  5. android:orientation="vertical">
  6. <LinearLayout android:id="@+id/resultTableContainer"
  7. android:layout_width="match_parent"
  8. android:layout_height="match_parent"
  9. android:orientation="vertical"
  10. android:visibility="gone">
  11. <ScrollView
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"
  14. android:scrollbars="horizontal"
  15. android:fillViewport="true">
  16. <HorizontalScrollView
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. android:fillViewport="true">
  20. <TableLayout android:id="@+id/resultTable"
  21. android:stretchColumns="1"
  22. android:layout_width="wrap_content"
  23. android:layout_height="wrap_content"
  24. android:shrinkColumns="false">
  25. </TableLayout>
  26. </HorizontalScrollView>
  27. </ScrollView>
  28. </LinearLayout>
  29. <LinearLayout android:id="@+id/formattedResultContainer"
  30. android:layout_width="match_parent"
  31. android:layout_height="match_parent"
  32. android:orientation="vertical"
  33. android:visibility="gone">
  34. <ScrollView android:id="@+id/formattedScrollContainer"
  35. android:layout_width="match_parent"
  36. android:layout_height="match_parent"
  37. android:scrollbars="vertical">
  38. <LinearLayout android:id="@+id/formattedResult"
  39. android:layout_width="match_parent"
  40. android:layout_height="wrap_content"
  41. android:orientation="vertical"/>
  42. </ScrollView>
  43. </LinearLayout>
  44. </RelativeLayout>

为简单起见,我将调用第一个线性布局容器视图1和第二个线性布局容器视图2.

默认情况下,两个视图的可见性设置都已消失,当屏幕首次加载时,视图1的可见性设置为可见,并使用以下代码动态生成视图:

  1. @Override
  2. public void processResult(final View.OnClickListener editRowClickListener,final View.OnLongClickListener columnLongClickListener)
  3. {
  4. try
  5. {
  6. this.getActivity().runOnUiThread(new Runnable()
  7. {
  8. @Override
  9. public void run()
  10. {
  11. if (shouldExistingResultBeCleared())
  12. {
  13. resultView.removeAllViews();
  14. }
  15. if (getSettings().getInt(Defines.SharedPreferenceSettings.APPLICATION_THEME,com.BoardiesITSolutions.Library.R.style.LibAppTheme)
  16. == com.BoardiesITSolutions.Library.R.style.LibAppTheme)
  17. {
  18. resultView.setBackgroundColor(Color.WHITE);
  19. }
  20. else
  21. {
  22. resultView.setBackgroundColor(Color.BLACK);
  23. }
  24. }
  25. });
  26.  
  27. this.showDialog(getJSONResult().length());
  28.  
  29. new Thread(new Runnable()
  30. {
  31. @Override
  32. public void run()
  33. {
  34. try
  35. {
  36. for (int i = 0; i < getJSONResult().length(); i++)
  37. {
  38. HashMap<Integer,String> fieldIndexAndValue = new HashMap<Integer,String>();
  39. final TableRow tr;
  40. if (!getSettings().getBoolean("IsDarkTheme",false))
  41. {
  42. tr = (TableRow) getFragment().getLayoutInflater(getFragment().getArguments()).inflate(R.layout.result_table_row_light_theme,resultView,false);
  43. } else
  44. {
  45. tr = (TableRow) getFragment().getLayoutInflater(getFragment().getArguments()).inflate(R.layout.result_table_row_dark_theme,false);
  46. }
  47. if (i == 0)
  48. {
  49. tr.setBackgroundColor(ContextCompat.getColor(getActivity(),R.color.appPrimaryColour));
  50. }
  51. else if (i % 2 == 0)
  52. {
  53. if (!getSettings().getBoolean("IsDarkTheme",false))
  54. {
  55. tr.setBackgroundColor(ContextCompat.getColor(getActivity(),R.color.resultRowLightThemeAlternateRow));
  56. } else
  57. {
  58. tr.setBackgroundColor(ContextCompat.getColor(getActivity(),R.color.resultRowDarkThemeAlternateRow));
  59. }
  60. }
  61. ImageButton imageButton = (ImageButton) getFragment().getLayoutInflater(getFragment().getArguments()).inflate(R.layout.row_edit_image,tr,false);
  62. imageButton.setOnClickListener(editRowClickListener);
  63. tr.addView(imageButton);
  64.  
  65. if (i == 0)
  66. {
  67. imageButton.setVisibility(View.INVISIBLE);
  68. }
  69.  
  70. JSONArray array = getJSONResult().getJSONArray(i);
  71. String currentField = null;
  72. for (int j = 0; j < array.length(); j++)
  73. {
  74. final TextView textView;
  75. textView = (TextView) getFragment().getLayoutInflater(getFragment().getArguments()).inflate(R.layout.result_textview,false);
  76. textView.setText(array.getString(j));
  77. if (!getSettings().getBoolean(Defines.SharedPreferenceSettings.MULTILINE_RESULT,true))
  78. {
  79. textView.setSingleLine(true);
  80. }
  81. if (i == 0)
  82. {
  83. textView.setTypeface(null,Typeface.BOLD);
  84. //Get the fields into a index and field hash map
  85. addIndexAndField(j,array.getString(j));
  86. } else
  87. {
  88. textView.setOnLongClickListener(columnLongClickListener);
  89. fieldIndexAndValue.put(j,array.getString(j));
  90. }
  91. getActivity().runOnUiThread(new Runnable()
  92. {
  93.  
  94. @Override
  95. public void run()
  96. {
  97. tr.addView(textView);
  98. }
  99. });
  100. }
  101. imageButton.setTag(fieldIndexAndValue);
  102.  
  103. getActivity().runOnUiThread(new Runnable()
  104. {
  105.  
  106. @Override
  107. public void run()
  108. {
  109. resultView.addView(tr);
  110. }
  111. });
  112. updateProgressDialog();
  113. //handler.sendMessage(handler.obtainMessage());
  114. }
  115. closeDialog();
  116. //((ResultProcessor)resultProcessor).closeDialog();
  117. }
  118. catch (JSONException ex)
  119. {
  120.  
  121. }
  122. }
  123. }).start();
  124. }
  125. catch (Exception ex)
  126. {
  127.  
  128. }
  129. }

这完全没问题.用户按下选项以切换到视图2,因此视图1被清除,可见性设置为消失,视图2被设置为可见.然后动态生成此视图,并相应地将单击侦听器设置为视图. (我没有包含此视图的代码,因为我认为它不相关,并且此视图始终无例外地工作).

如果用户然后切换回视图1,则清除视图2,并且可见性设置为消失,视图1恢复可见,并且使用与上面所示相同的方法动态地重新创建视图并分配on click侦听器.

视图自我看起来很好,但是没有用户交互可能,滚动视图不再垂直或水平滚动,并且点击处理程序都不起作用.

由于视图1工作一次,我不明白为什么它不会重新生成,但视图2总是有效,无论如何.

解决方法

我已经设法解决了我遇到的问题,感谢大家的帮助,我尝试了所建议但不幸的是没有太大的影响.

我目前所拥有的是一个片段,它必须是线性布局容器,当视图被切换时,一个容器被隐藏并显示容器,然后重新加载相关的视图内容.

我改为将每个视图更改为不同的片段并使用自己的XML布局文件,然后在切换视图时,它使用片段事务将一个片段视图替换为另一个,然后使用相同的代码正如我上面动态填充相关的视图内容.

猜你在找的Android相关文章