Horizontalscrollview:从另一个返回时 imageView 消失 Activity
Horizontalscrollview: imageView disappear when coming back from another Activity
我正在开发我的第一个应用程序,我遇到了 ImageViews 和 Horizontalscrollview 的问题:我想收集用户在 Horizontalscrollview 中添加图像所达到的所有目标(达到目标 --> 显示新图像)。
how 4 completed goals are displayed
它们显示正确并且一切似乎都正常,但是当我打开另一个 activity 然后我回来时,它们消失了。我试图使布局无效但没有任何效果,我是否遗漏了什么?
提前致谢!
这是我的XML文件
<!-- language: lang-xml -->
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout3"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Main3Activity">
<HorizontalScrollView
android:id="@+id/horizontal_scroll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="300dp">
<LinearLayout
android:id="@+id/linear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
</HorizontalScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
这是我的Java代码
我用来检查目标是否完成的函数:
<!-- language: lang-java -->
protected void checkGoal(){
int progress = calculateProgress();
if(goalPref.getInt("Goal",0)!=0){
if(progress >= goalPref.getInt("Goal", 0)) {
int id = layout.getChildCount();
addNewImage(id); // <-- here I add the image
question.setText(R.string.setgoal);
updateGoalPref(0);
if (list.size() != 0) {
list = new ArrayList<>();
}
updateProgress();
}
}
}
我用来添加图片的功能:
<!-- language: lang-java -->
protected void addNewImage(int id){
ImageView imageView = new ImageView(this);
imageView.setId(id);
imageView.setPadding(2, 2, 2, 2);
imageView.setBackgroundResource(R.drawable.check);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
layout.addView(imageView, id);
}
当你去另一个activity回来时,你应该在onResume中调用addNewImage
重新显示图像:
@Override
protected void onResume() {
super.onResume();
addNewImage(id);
}
如果 activity 中的目标数量有限,为什么不在 XML 中创建这些 ImageView 并在 java 中设置它们的可见性?
因为我很固执,所以我设法找到了另一种方法来做到这一点,这就是我所做的:使用我发布的代码我添加了一个计数器来跟踪用户达到了多少目标并且onResume()
我显示与计数器值一样多的图像。
这样,用户可以立即看到达成目标的效果,activity不会失去任何东西。
然后,我实现了它以显示目标描述,将 TextViews 中的 ImageViews 更改为这些图像作为背景。我没有使用计数器,而是将要显示的字符串保存在 ArrayList 中,并将其大小用作计数器。
希望对大家有用!
<!-- language: lang-java -->
protected void checkGoal(){
int progress = calculateProgress();
if(goalPref.getInt("Goal",0)!=0){
if(progress >= goalPref.getInt("Goal", 0)) {
String newString = goalPref.getInt("Goal", 0) + "€, " + MainActivity.currentDate();
goalsCompleted.add(newString);
updateGoalCompletedList();
//Here I clean the layout and display all the TextViews
layout.removeAllViews();
for(int i=goalsCompleted.size()-1; i>0; i--){
addNewTextView(i);
}
question.setText(R.string.setgoal);
updateGoalPref(0);
if (list.size() != 0) {
list = new ArrayList<>();
}
updateProgress();
}
}
}
//The function used to display the TextViews
protected void addNewTextView(int id){
TextView textView = new TextView(this);
textView.setBackgroundResource(R.drawable.check1);
textView.setId(id);
textView.setPadding(25,260,0,0);
textView.setTextSize(12);
textView.setText(goalsCompleted.get(id));
layout.addView(textView);
}
//The function used to update and save the array
public void updateGoalCompletedList(){
Gson gson3 = new Gson();
jsonItems3 = gson3.toJson(goalsCompleted);
SharedPreferences.Editor listEd = goalsCompletedPref.edit();
listEd.putString("GoalsCompleted", jsonItems3).apply();
}
//The function used to resume the array, you can call it on onResume() or onCreate()
public void resumeGoalsCompleted(){
Gson gson3 = new Gson();
String savedList = goalsCompletedPref.getString("GoalsCompleted", "");
goalsCompleted = gson3.fromJson(savedList, new TypeToken<ArrayList<String>>() {
}.getType());
if(goalsCompleted==null)
goalsCompleted = new ArrayList<>();
//From the most recent to the least recent
for(int i=goalsCompleted.size()-1; i>0; i--){
addNewTextView(i);
}
}
我正在开发我的第一个应用程序,我遇到了 ImageViews 和 Horizontalscrollview 的问题:我想收集用户在 Horizontalscrollview 中添加图像所达到的所有目标(达到目标 --> 显示新图像)。
how 4 completed goals are displayed
它们显示正确并且一切似乎都正常,但是当我打开另一个 activity 然后我回来时,它们消失了。我试图使布局无效但没有任何效果,我是否遗漏了什么?
提前致谢!
这是我的XML文件
<!-- language: lang-xml -->
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout3"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Main3Activity">
<HorizontalScrollView
android:id="@+id/horizontal_scroll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="300dp">
<LinearLayout
android:id="@+id/linear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
</HorizontalScrollView>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
这是我的Java代码 我用来检查目标是否完成的函数:
<!-- language: lang-java -->
protected void checkGoal(){
int progress = calculateProgress();
if(goalPref.getInt("Goal",0)!=0){
if(progress >= goalPref.getInt("Goal", 0)) {
int id = layout.getChildCount();
addNewImage(id); // <-- here I add the image
question.setText(R.string.setgoal);
updateGoalPref(0);
if (list.size() != 0) {
list = new ArrayList<>();
}
updateProgress();
}
}
}
我用来添加图片的功能:
<!-- language: lang-java -->
protected void addNewImage(int id){
ImageView imageView = new ImageView(this);
imageView.setId(id);
imageView.setPadding(2, 2, 2, 2);
imageView.setBackgroundResource(R.drawable.check);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
layout.addView(imageView, id);
}
当你去另一个activity回来时,你应该在onResume中调用addNewImage
重新显示图像:
@Override
protected void onResume() {
super.onResume();
addNewImage(id);
}
如果 activity 中的目标数量有限,为什么不在 XML 中创建这些 ImageView 并在 java 中设置它们的可见性?
因为我很固执,所以我设法找到了另一种方法来做到这一点,这就是我所做的:使用我发布的代码我添加了一个计数器来跟踪用户达到了多少目标并且onResume()
我显示与计数器值一样多的图像。
这样,用户可以立即看到达成目标的效果,activity不会失去任何东西。
然后,我实现了它以显示目标描述,将 TextViews 中的 ImageViews 更改为这些图像作为背景。我没有使用计数器,而是将要显示的字符串保存在 ArrayList 中,并将其大小用作计数器。
希望对大家有用!
<!-- language: lang-java -->
protected void checkGoal(){
int progress = calculateProgress();
if(goalPref.getInt("Goal",0)!=0){
if(progress >= goalPref.getInt("Goal", 0)) {
String newString = goalPref.getInt("Goal", 0) + "€, " + MainActivity.currentDate();
goalsCompleted.add(newString);
updateGoalCompletedList();
//Here I clean the layout and display all the TextViews
layout.removeAllViews();
for(int i=goalsCompleted.size()-1; i>0; i--){
addNewTextView(i);
}
question.setText(R.string.setgoal);
updateGoalPref(0);
if (list.size() != 0) {
list = new ArrayList<>();
}
updateProgress();
}
}
}
//The function used to display the TextViews
protected void addNewTextView(int id){
TextView textView = new TextView(this);
textView.setBackgroundResource(R.drawable.check1);
textView.setId(id);
textView.setPadding(25,260,0,0);
textView.setTextSize(12);
textView.setText(goalsCompleted.get(id));
layout.addView(textView);
}
//The function used to update and save the array
public void updateGoalCompletedList(){
Gson gson3 = new Gson();
jsonItems3 = gson3.toJson(goalsCompleted);
SharedPreferences.Editor listEd = goalsCompletedPref.edit();
listEd.putString("GoalsCompleted", jsonItems3).apply();
}
//The function used to resume the array, you can call it on onResume() or onCreate()
public void resumeGoalsCompleted(){
Gson gson3 = new Gson();
String savedList = goalsCompletedPref.getString("GoalsCompleted", "");
goalsCompleted = gson3.fromJson(savedList, new TypeToken<ArrayList<String>>() {
}.getType());
if(goalsCompleted==null)
goalsCompleted = new ArrayList<>();
//From the most recent to the least recent
for(int i=goalsCompleted.size()-1; i>0; i--){
addNewTextView(i);
}
}