You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android AddResult Activity中EditText同时显示科目名提示与分数的实现问题

问题背景

这是我的AddResult Activity,包含插入、更新两个功能:

public class AddResult extends AppCompatActivity {
    EditText eng, urdu, math, bio, chem, phy, rol;
    Database database;
    Button btnsave;
    int roll;
    ArrayList<resultmodel> result;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_result);
        database = new Database(this);
        eng = findViewById(R.id.edsub1);
        urdu = findViewById(R.id.edsub2);
        math = findViewById(R.id.edsub3);
        phy = findViewById(R.id.edsub4);
        btnsave = findViewById(R.id.save);
        bio = findViewById(R.id.edsub5);
        chem = findViewById(R.id.edsub6);
        Intent intent = getIntent();
        roll = intent.getIntExtra("id", 0);
        result = database.search(roll);
        if (result.size() > 0)
            updataData();
        else
            insertData();
    }

    public void insertData() {
        btnsave.setOnClickListener(v -> {
            String E = eng.getText().toString();
            String U = urdu.getText().toString();
            String M = math.getText().toString();
            String B = bio.getText().toString();
            String P = phy.getText().toString();
            String C = chem.getText().toString();
            if (E.equals("") || U.equals("") || M.equals("") || B.equals("") || P.equals("") || C.equals(""))
                Toast.makeText(this, "Please fill all field first", Toast.LENGTH_SHORT).show();
            else {
                int English = Integer.parseInt(E);
                int Bio = Integer.parseInt(B);
                int Math = Integer.parseInt(M);
                int Urdu = Integer.parseInt(U);
                int Physics = Integer.parseInt(P);
                int Chemistry = Integer.parseInt(C);
                resultmodel result = new resultmodel(English, Urdu, Math, Bio, Chemistry, Physics, roll);
                int i = database.resultInsertion(result);
                if (i == 1)
                    Toast.makeText(this, "Result is inserted", Toast.LENGTH_SHORT).show();
                else
                    Toast.makeText(this, "Result is not inserted", Toast.LENGTH_SHORT).show();
            }
        });
    }

问题出现在以下更新方法中:

public void updataData() {
    btnsave.setText("UPDATE");
    resultmodel m = result.get(0);
    bio.setText(String.valueOf(m.getB()));
    chem.setText(String.valueOf(m.getC()));
    phy.setText(String.valueOf(m.getP()));
    urdu.setText(String.valueOf(m.getU()));
    eng.setText(String.valueOf(m.getE()));
    math.setText(String.valueOf(m.getM()));
    btnsave.setOnClickListener(v -> {
        String E = eng.getText().toString();
        String U = urdu.getText().toString();
        String M = math.getText().toString();
        String B = bio.getText().toString();
        String P = phy.getText().toString();
        String C = chem.getText().toString();
        if (E.equals("") || U.equals("") || M.equals("") || B.equals("") || P.equals("") || C.equals(""))
            Toast.makeText(this, "Please fill all field first", Toast.LENGTH_SHORT).show();
        else {
            int English = Integer.parseInt(E);
            int Bio = Integer.parseInt(B);
            int Math = Integer.parseInt(M);
            int Urdu = Integer.parseInt(U);
            int Physics = Integer.parseInt(P);
            int Chemistry = Integer.parseInt(C);
            resultmodel result = new resultmodel(English, Urdu, Math, Bio, Chemistry, Physics, roll);
            Boolean b = database.updateresult(result);
            if (b == true)
                Toast.makeText(this, "Data is updated", Toast.LENGTH_SHORT).show();
            else
                Toast.makeText(this, "Result is not updated", Toast.LENGTH_SHORT).show();
        }
    });
}
}

具体问题

复用同一个布局实现成绩的插入与更新功能,插入场景下的EditText已设置对应科目名的hint提示。当布局用于更新场景时,填充此前录入的分数后,输入框仅展示分数,用户无法看到对应科目名称,难以区分每个输入框对应的科目。需要实现更新场景下,EditText的hint仍显示科目名称,同时输入框文本区域填充对应科目的已有分数,方便用户识别后修改。

界面参考:
无科目名的更新界面易混淆
录入界面展示


解决方案

方案1:使用TextInputLayout(推荐)

这是Android官方推荐的实现方式,无需修改原有业务逻辑,仅调整布局即可实现需求:

  1. 先在模块级build.gradle中引入Material组件依赖:
dependencies {
    implementation 'com.google.android.material:material:1.9.0'
    // 其余原有依赖保持不变
}
  1. 修改布局文件,将每个EditText用TextInputLayout包裹,将科目hint设置在TextInputLayout上即可,示例代码如下:
<com.google.android.material.textfield.TextInputLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:hint="英语">

    <com.google.android.material.textfield.TextInputEditText
        android:id="@+id/edsub1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="number"/>

</com.google.android.material.textfield.TextInputLayout>

其余科目的输入框按照相同格式修改即可。该实现下,无论输入框是否有内容,科目名称都会始终显示:无内容时hint显示在输入框内,有内容时hint缩小浮动到输入框左上角,完全符合需求。

方案2:自定义EditText(无需引入Material组件)

如果不想引入Material组件,可以自定义EditText,在有内容时将固定hint绘制在输入框右侧:

  1. 新建自定义EditText类:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.text.TextUtils;
import android.util.AttributeSet;

import androidx.appcompat.widget.AppCompatEditText;

public class FixedHintEditText extends AppCompatEditText {
    private Paint hintPaint;
    private String fixedHint;

    public FixedHintEditText(Context context) {
        super(context);
        init();
    }

    public FixedHintEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public FixedHintEditText(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        hintPaint = new Paint();
        hintPaint.setColor(Color.GRAY);
        hintPaint.setTextSize(getTextSize() * 0.8f);
        fixedHint = getHint().toString();
        // 给右侧留出绘制hint的空间
        setPadding(getPaddingLeft(), getPaddingTop(), (int) hintPaint.measureText(fixedHint) + 30, getPaddingBottom());
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (!TextUtils.isEmpty(getText())) {
            // 有内容时在输入框右侧绘制固定hint
            canvas.drawText(fixedHint, getWidth() - hintPaint.measureText(fixedHint) - 15, getBaseline(), hintPaint);
        }
    }
}
  1. 将布局中原有的EditText替换为FixedHintEditText即可。

内容的提问来源于stack exchange,提问作者Mubashar Ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:27:06