gpt4 book ai didi

java - 尝试在空对象引用上调用 ScrollView.removeAllViews()

转载 作者:行者123 更新时间:2023-12-01 19:22:45 25 4
gpt4 key购买 nike

我正在制作一个简单的提醒应用程序。

当我关闭第二个使用 SharedPreferences 添加新任务的 Activity 时,就会出现问题,并且在此操作之前没有任何任务 (count_of_tasks = 0)。

异常说 findViewById(R.id.scroll_view) 返回 null :

ScrollView scrollView = findViewById(R.id.scroll_view);

但是前面的代码行不返回 null :

LinearLayout parent_layout = findViewById(R.id.parent_layout);

为什么?

如果我重新启动应用程序,布局就不会出现任何问题。

错误:

java.lang.RuntimeException: Unable to resume activity {com.example.memorytasks/com.example.memorytasks.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ScrollView.removeAllViews()' on a null object reference
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4014)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4046)
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51)
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1948)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7050)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ScrollView.removeAllViews()' on a null object reference
at com.example.memorytasks.MainActivity.loadTasks(MainActivity.java:52)
at com.example.memorytasks.MainActivity.onResume(MainActivity.java:40)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1412)
at android.app.Activity.performResume(Activity.java:7572)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:4006)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:4046) 
at android.app.servertransaction.ResumeActivityItem.execute(ResumeActivityItem.java:51) 
at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:145) 
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1948) 
at android.os.Handler.dispatchMessage(Handler.java:106) 
at android.os.Looper.loop(Looper.java:214) 
at android.app.ActivityThread.main(ActivityThread.java:7050) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965) 

公共(public)类 MainActivity 扩展 AppCompatActivity {

    Toolbar toolbar;
FloatingActionButton fab;

@Override
protected void onCreate (Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
fab = findViewById(R.id.fab);
}
@Override
protected void onResume () {

super.onResume();

loadTasks();
}
private void loadTasks () {

LinearLayout parent_layout = findViewById(R.id.parent_layout);
ScrollView scrollView = findViewById(R.id.scroll_view);
LinearLayout tasks_layout = findViewById(R.id.tasks_layout);

SharedPreferences sPref = getSharedPreferences("tasks", MODE_PRIVATE);
int count_of_tasks = sPref.getInt("count_of_tasks", 0);

parent_layout.removeAllViews();
scrollView.removeAllViews();
tasks_layout.removeAllViews();

if (count_of_tasks > 0) {
parent_layout.addView(scrollView);
scrollView.addView(tasks_layout);
for (int i = count_of_tasks; i > 0; i--) {
/** Task name */
{
TextView t = new TextView(this);
t.setId(i);
t.setText(sPref.getString("taskName" + i,""));
t.setTextSize(TypedValue.COMPLEX_UNIT_SP,32);
t.setBackgroundColor(Color.argb(50,56,142,60));
t.setPadding(20, 20, 20, 20);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(20,10,20,10);
t.setLayoutParams(params);
tasks_layout.addView(t);
}
/** Extra information */
{
TextView t = new TextView(this);
t.setId((i + 1) * i);

String task = sPref.getString("task" + i,"");
if (task.equals("")) {
task += "\n\n";
}
task += sPref.getString("date" + i,"");

t.setText(task);
t.setTextSize(TypedValue.COMPLEX_UNIT_SP,20);
t.setBackgroundColor(Color.argb(20,56,142,60));
t.setPadding(20, 20, 20, 20);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.setMargins(20,-10,20,10);
t.setLayoutParams(params);
tasks_layout.addView(t);
}}}
else {
TextView task1 = new TextView(this);
task1.setId(R.id.task1);
task1.setText("Здесь пока ничего нет.");
task1.setTextSize(TypedValue.COMPLEX_UNIT_SP,32);
task1.setGravity(Gravity.CENTER);
task1.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT));

parent_layout.addView(task1);
}
}
public void fabOnClick (View v) {

startActivity(new Intent(MainActivity.this, NewTaskActivity.class));
}
@Override
public boolean onCreateOptionsMenu (Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@SuppressLint("ApplySharedPref")
@Override
public boolean onOptionsItemSelected (MenuItem item) {

if (item.getItemId() == R.id.action_settings) {
getSharedPreferences("tasks", MODE_PRIVATE).edit().clear().commit();
onResume();
return true;
}
return super.onOptionsItemSelected(item);
}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="#388E3C"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:title="Memory Tasks" />

</android.support.design.widget.AppBarLayout>

<include layout="@layout/content_main" />

<android.support.design.widget.FloatingActionButton
android:id="@+id/fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|end"
android:layout_margin="@dimen/fab_margin"
android:onClick="fabOnClick"
app:backgroundTint="#205020"
app:srcCompat="@android:drawable/ic_input_add" />

</android.support.design.widget.CoordinatorLayout>

context_main.xml

?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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/parent_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:layout_editor_absoluteY="56dp"
tools:showIn="@layout/activity_main">

<ScrollView
android:id="@+id/scroll_view"
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
android:id="@+id/tasks_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
</ScrollView>

</LinearLayout>

最佳答案

问题是,如果您的 count_of_tasks 为 0,则 ScrollView 将从内容 View 中删除并且永远不会放回原处,因此下一个 findViewById 调用无法找到它。您应该将该 findViewById 调用移至 onCreate 方法并将其存储为成员变量,类似于您对 fab 所做的操作。

这就是为什么将 setContentView 移动到 onResume 似乎可以修复它 - 它每次都会将其恢复。存储它将使您能够在 onCreate 中保留 setContentView 调用。

关于java - 尝试在空对象引用上调用 ScrollView.removeAllViews(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59342238/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com