android - 新文本字段未显示在 ToDoList 类型的应用程序中
问题描述
所以我是应用程序开发的新手,正在开发一种可以平衡化学方程式的 todolist 类型的应用程序。单击浮动(+)按钮时,应弹出一个左侧带有复选框的新文本字段,并且可以输入和保存数据。所以,它涉及到一个适配器类、模型类、数据库处理程序类、AddNewTask 类,所有这些都是我要添加的。问题是在单击按钮时,带有保存按钮的文本字段会随键盘出现以输入文本,但在单击保存按钮时它不会“保存”它。
适配器类:
public class EqBalAdapter extends RecyclerView.Adapter<EqBalAdapter.ViewHolder> {
private List<EqBalModel> EqBalList;
private MainActivity activity;
private DatabaseHandler db;
public List<String> finalPrintval = new ArrayList<String>();
public EqBalAdapter(DatabaseHandler db, MainActivity activity){
this.db=db;
this.activity=activity;
}
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
View itemView= LayoutInflater.from(parent.getContext())
.inflate(R.layout.task_layout, parent, false);
return new ViewHolder(itemView);
}
public void onBindViewHolder(ViewHolder holder, int position){
db.openDatabase();
EqBalModel item=EqBalList.get(position);
holder.task.setText(item.getTask());
holder.task.setChecked(toBoolean(item.getStatus()));
holder.task.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked){
db.updateStatus(item.getId(),1);
finalPrintval.add(item.getTask());
}else{
db.updateStatus(item.getId(),0);
}
}
});
}
public int getItemCount(){
return EqBalList.size();
}
private boolean toBoolean(int n){
return n!=0;
}
public void setTasks(List<EqBalModel> EqBalList){
this.EqBalList=EqBalList;
notifyDataSetChanged();
}
public Context getContext(){
return activity;
}
public void deleteItem(int position){
EqBalModel item=EqBalList.get(position);
db.deleteTask((item.getId()));
EqBalList.remove(position);
notifyItemRemoved(position);
}
public void editItem(int position){
EqBalModel item=EqBalList.get(position);
Bundle bundle = new Bundle();
bundle.putInt("id", item.getId());
bundle.putString("task", item.getTask());
AddNewTask fragment = new AddNewTask();
fragment.setArguments(bundle);
fragment.show(activity.getSupportFragmentManager(), AddNewTask.TAG);
}
public static class ViewHolder extends RecyclerView.ViewHolder{
CheckBox task;
ViewHolder(View view){
super(view);
task=view.findViewById(R.id.checkbox);
}
}
}
型号类:
public class EqBalModel {
private int id, status;
private String task;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public String getTask() {
return task;
}
public void setTask(String task) {
this.task = task;
}
}
数据库处理程序类:
public class DatabaseHandler extends SQLiteOpenHelper {
private static final int VERSION=1;
private static final String NAME="EqualDatabase";
private static final String TODO_TABLE = "todo";
private static final String ID="id";
private static final String TASK="task";
private static final String STATUS="status";
private static final String CREATE_TODO_TABLE = "CREATE TABLE " + TODO_TABLE + "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
+ TASK + "TEXT, " + STATUS + " INTEGER)";
private SQLiteDatabase db;
public DatabaseHandler(Context context){
super(context, NAME, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(CREATE_TODO_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
//DROP EXISTING TABLES
db.execSQL("DROP TABLE IF EXISTS " + TODO_TABLE);
//CREATE TABLES AGAIN
onCreate(db);
}
public void openDatabase(){
db=this.getWritableDatabase();
}
public void insertTask(EqBalModel task){
ContentValues cv = new ContentValues();
cv.put(TASK, task.getTask());
cv.put(STATUS, 0);
db.insert(TODO_TABLE, null, cv);
}
public List<EqBalModel> getAllTasks(){
List<EqBalModel> taskList = new ArrayList<>();
Cursor cur=null;
db.beginTransaction();
try{
cur = db.query(TODO_TABLE, null, null, null, null, null, null, null);
if(cur!= null){
if(cur.moveToFirst()){
do{
EqBalModel task = new EqBalModel();
task.setId(cur.getInt(cur.getColumnIndex(ID)));
task.setTask(cur.getString(cur.getColumnIndex(TASK)));
task.setStatus(cur.getInt(cur.getColumnIndex(STATUS)));
taskList.add(task);
}while (cur.moveToNext());
}
}
}finally {
db.endTransaction();
cur.close();
}
return taskList;
}
public void updateStatus(int id, int status){
ContentValues cv = new ContentValues();
cv.put(STATUS, status);
db.update(TODO_TABLE, cv, ID + "=?", new String[] {String.valueOf(id)});
}
public void updateTask(int id, String task){
ContentValues cv=new ContentValues();
cv.put(TASK, task);
db.update(TODO_TABLE, cv, ID + "=?", new String[] {String.valueOf(id)});
}
public void deleteTask(int id){
db.delete(TODO_TABLE, ID + "=?", new String[] {String.valueOf(id)});
}
}
AddNewTask 类:
import android.app.Activity;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import androidx.core.content.ContextCompat;
import com.example.chemicalequationbalancer.Adapter.EqBalAdapter;
import com.example.chemicalequationbalancer.Model.EqBalModel;
import com.example.chemicalequationbalancer.Utils.DatabaseHandler;
import com.google.android.material.bottomsheet.BottomSheetDialogFragment;
import com.google.android.material.snackbar.Snackbar;
import java.util.zip.Inflater;
public class AddNewTask extends BottomSheetDialogFragment{
public static final String TAG = "ActionBottomDialog";
private EditText newTaskTest;
private Button newTaskSaveButton;
private DatabaseHandler db;
EqAlgo obj = new EqAlgo();
public static AddNewTask newInstance(){
return new AddNewTask();
}
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setStyle(STYLE_NORMAL, R.style.DialogStyle);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
View view= inflater.inflate(R.layout.new_task, container, false);
getDialog().getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
return view;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
newTaskTest=getView().findViewById(R.id.newTaskText);
newTaskSaveButton=getView().findViewById(R.id.newTaskButton);
db=new DatabaseHandler(getActivity());
db.openDatabase();
boolean isUpdate = false;
final Bundle bundle = getArguments();
if(bundle != null){
isUpdate=true;
String task=bundle.getString("task");
newTaskTest.setText(task);
if(task.length()>0)
newTaskSaveButton.setTextColor(ContextCompat.getColor(getContext(),R.color.teal));
}
newTaskTest.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(s.toString().equals(" ") || s.toString().equals("ERROR")){
newTaskSaveButton.setEnabled(false);
newTaskSaveButton.setTextColor(Color.GRAY);
newTaskSaveButton.setBackgroundColor(Color.RED);
s.toString().equals("REFER TO HELP GUIDE");
}else{
newTaskSaveButton.setEnabled(true);
newTaskSaveButton.setTextColor(ContextCompat.getColor(getContext(),R.color.teal));
}
}
@Override
public void afterTextChanged(Editable s) {
if(s.toString().startsWith("Eq")){
String maineqtobeChck = (String) s.subSequence(2,s.length());
s.append(obj.equationBalance(maineqtobeChck));
}
}
});
boolean finalIsUpdate = isUpdate;
newTaskSaveButton.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
String text = newTaskTest.getText().toString();
Snackbar mySnackbar = Snackbar.make(v, text, 5000);
if(finalIsUpdate){
db.updateTask(bundle.getInt("id"), text);
mySnackbar.show();
}else{
EqBalModel task = new EqBalModel();
task.setTask(text);
task.setStatus(0);
}
dismiss();
}
});
}
@Override
public void onDismiss(DialogInterface dialog){
Activity activity=getActivity();
if(activity instanceof DialogCloseListener){
((DialogCloseListener)activity).handleDialogClose(dialog);
}
}
}
MainActivity 浮动按钮代码:
db = new DatabaseHandler(this);
db.openDatabase();
taskList = new ArrayList<>();
taskRecyclerView = findViewById(R.id.reacRecyclerView);
taskRecyclerView.setLayoutManager(new LinearLayoutManager(this));
tasksAdapter = new EqBalAdapter(db, this);
taskRecyclerView.setAdapter(tasksAdapter);
fab = findViewById(R.id.fab);
ItemTouchHelper itemTouchHelper = new
ItemTouchHelper(new RecyclerItemTouchHelper(tasksAdapter));
itemTouchHelper.attachToRecyclerView(taskRecyclerView);
taskList = db.getAllTasks();
Collections.reverse(taskList);
tasksAdapter.setTasks(taskList);
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AddNewTask.newInstance().show(getSupportFragmentManager(), AddNewTask.TAG);
}
输入必须以两种方式进行:从方程式或普通文本的 Eq 开始。使用 Eq 键入时,应用程序关闭并出现以下 logcat 错误:
2021-03-05 17:02:45.128 31607-31607/com.example.chemicalequationbalancer E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.chemicalequationbalancer, PID: 31607
java.lang.ClassCastException: android.text.SpannableStringBuilder cannot be cast to java.lang.String
at com.example.chemicalequationbalancer.AddNewTask$1.afterTextChanged(AddNewTask.java:92)
at android.widget.TextView.sendAfterTextChanged(TextView.java:9903)
at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:12741)
at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:1273)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:576)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:506)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:36)
at android.view.inputmethod.BaseInputConnection.replaceText(BaseInputConnection.java:863)
at android.view.inputmethod.BaseInputConnection.setComposingText(BaseInputConnection.java:636)
at com.android.internal.view.IInputConnectionWrapper.executeMessage(IInputConnectionWrapper.java:401)
at com.android.internal.view.IInputConnectionWrapper$MyHandler.handleMessage(IInputConnectionWrapper.java:85)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:226)
at android.app.ActivityThread.main(ActivityThread.java:7191)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:499)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:942)
2021-03-05 17:02:45.246 1196-3325/? E/Process: get_ion_cache_memory: Unable to open /d/ion/heaps/system
2021-03-05 17:02:45.267 1196-1322/? E/InputDispatcher: channel '6510a0d com.example.chemicalequationbalancer/com.example.chemicalequationbalancer.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
2021-03-05 17:02:45.268 1196-1322/? E/InputDispatcher: channel 'e291db4 com.example.chemicalequationbalancer/com.example.chemicalequationbalancer.MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!
2021-03-05 17:02:45.302 31963-31963/? E/.qualityprotec: Not starting debugger since process cannot load the jdwp agent.
2021-03-05 17:02:45.320 31963-31963/? E/libc: Access denied finding property "persist.vendor.sys.activitylog"
2021-03-05 17:02:45.363 20699-20724/? E/neodaemon: ERROR elsaNotifyAppSwitch is NULL
2021-03-05 17:02:45.381 1196-4979/? E/OifaceUtil: Cannot connect to OifaceService
正常键入时,应用程序不会关闭,但保存后没有创建字段。logcat 说内存不足。
请询问更多需要的文件!如果你能提供帮助,真的很感激。谢谢!
解决方案
推荐阅读
- bash - bash 脚本中“jobs”命令的奇怪行为
- python - 使用 Scrapy 在 .asp 网站上下载所有 pdf 文件时出现问题
- html - 使模式内的引导表可滚动
- azure - 如果发生异常,向 Azure Function Dead-letter-queue 添加其他信息
- ant - 为什么我的单目标 Ant 构建不运行目标?
- java - 检测软导航栏中的更改键盘按钮
- windows - 当我使用带有 -e 选项的 Perl 解释器时出现以下错误
- css - 当元素绝对定位时,'margin-top,-left,-bottom,-right'和'top,left,bottom,right'属性之间有什么区别吗?
- docker - 我一直在尝试使用 dockerfile 和 docker compose 在 apache 映像上创建一个文件夹
- gnuplot - 设置线型是否也设置线色?