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官方推荐的实现方式,无需修改原有业务逻辑,仅调整布局即可实现需求:
- 先在模块级
build.gradle中引入Material组件依赖:
dependencies { implementation 'com.google.android.material:material:1.9.0' // 其余原有依赖保持不变 }
- 修改布局文件,将每个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绘制在输入框右侧:
- 新建自定义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); } } }
- 将布局中原有的EditText替换为
FixedHintEditText即可。
内容的提问来源于stack exchange,提问作者Mubashar Ali
相关产品推荐
相关产品推荐

