android - 应用程序不断给出错误,因为数组超出范围
问题描述
我正在制作一个记录笔记的 android 应用程序。当我尝试添加新注释时,它会给出一个数组超出范围的错误。我检查了我的代码,但我似乎无法弄清楚它为什么不起作用。我已经设置了 if 和 else 语句,它们在默认的负 1 索引值的情况下更改索引值。
主要活动代码
package com.example.notes;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
static ArrayList<String> notes = new ArrayList<String>();
static ArrayAdapter arrayAdapter;
//MENU
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
MenuInflater menuInflater = this.getMenuInflater();
menuInflater.inflate(R.menu.add_note,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
super.onOptionsItemSelected(item);
if(item.getItemId() == R.id.addNote){
Intent intent = new Intent(getApplicationContext(),NoteEditor.class);
startActivity(intent);
return true;
}
else{
return false;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView) findViewById(R.id.listView);
notes.add("Example note");
arrayAdapter = new ArrayAdapter(this,android.R.layout.simple_list_item_1,notes);
listView.setAdapter(arrayAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Intent intent = new Intent(getApplicationContext(),NoteEditor.class);
intent.putExtra("NoteId",i);
startActivity(intent);
}
});
}
}
新活动代码
package com.example.notes;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.widget.EditText;
public class NoteEditor extends AppCompatActivity {
int noteId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_note_editor);
EditText editText = findViewById(R.id.editText);
Intent intent = getIntent();
noteId = intent.getIntExtra("NoteId",-1);
if(noteId != 1)
{
editText.setText(MainActivity.notes.get(noteId));
}
else{
MainActivity.notes.add("");
noteId = MainActivity.notes.size() - 1 ;
}
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
}
@Override
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
MainActivity.notes.set(noteId,String.valueOf(charSequence));
MainActivity.arrayAdapter.notifyDataSetChanged();
}
@Override
public void afterTextChanged(Editable editable) {
}
});
}
}
错误信息
2020-05-14 16:36:02.931 21411-21411/com.example.notes E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.notes, PID: 21411
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.notes/com.example.notes.NoteEditor}: java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2913)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
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:858)
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=10; index=-1
at java.util.ArrayList.get(ArrayList.java:439)
at com.example.notes.NoteEditor.onCreate(NoteEditor.java:25)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
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:858)
解决方案
您应该将条件更改为
if(noteId != -1){
editText.setText(MainActivity.notes.get(noteId));
}
推荐阅读
- android - 在片段中使用上下文的更好方法是什么?
- python - Django - pdf 响应的编码错误 - reportlab
- perforce - Depot 中的文件在 Workspace 中不可见
- kafka-consumer-api - 每个键的动态窗口聚合
- javascript - 即使没有运行,函数范围是否已经在初始编译时确定?
- javascript - 如何通过 Rails 中的帖子 ID 在社交媒体上分享您博客中的帖子
- c++ - 从 C++ 列表中删除项目
- pyspark - 有没有类似的方法可以在pyspark中复制熊猫的“qcut”功能?
- c# - 按钮单击事件上的 HTML 表日期松动
- ios - 无法使用 NSKeyedArchiver 保存我的模型