自定义布局内部的EDITTEXT不起作用



我正在尝试模仿新的Oreo TimePicker

我创建了布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<LinearLayout
    android:id="@+id/hour_layout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <EditText
        android:id="@+id/hour_input"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="2"
        android:textAlignment="center"
        android:focusable="true"/>
    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="hour" />
</LinearLayout>
<TextView
    android:id="@+id/textView3"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_weight="1"
    android:gravity="center_vertical"
    android:paddingBottom="10dp"
    android:text=":"
    android:textSize="24sp" />
<LinearLayout
    android:id="@+id/minute_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <EditText
        android:id="@+id/minute_input"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="2"
        android:textAlignment="center" />
    <TextView
        android:id="@+id/textView5"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="minute" />
</LinearLayout>
<Spinner
    android:id="@+id/ampm_spinner"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginLeft="10dp"
    android:layout_weight="1" />

我还创建了支撑班(设置器和Geters未包括以下:

public class ManualTimePicker extends LinearLayout {
private final static String TAG = "ManualTimePicker():";
TextView hour;
TextView minute;
Spinner ampm;
private Integer fieldInputType;
public ManualTimePicker(Context context) {
    super(context);
    init(context);
}
public ManualTimePicker(Context context, @Nullable AttributeSet  
 attributeSet) {
    super(context, attributeSet);
    TypedArray attrs = context.obtainStyledAttributes
 (attributeSet, R.styleable.ManualTimePicker, 0, 0);
    fieldInputType = attrs.getInt
 (R.styleable.ManualTimePicker_H_android_text,InputType.TYPE_CLASS_NUMBER);
    attrs.recycle();
    init(context);
}
public ManualTimePicker
 (Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context);
}
public ManualTimePicker
 (Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
    init(context);
}
private void init(final Context context) {

    View.inflate(context, R.layout.manual_time_picker, this);
    setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS);
    hour = findViewById(R.id.hour_input);
    minute = findViewById(R.id.minute_input);
    hour.setText("7");
    minute.setText("00");
    hour.setFocusable(true);
    hour.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            Log.d(TAG, "Hour field is clicked");
            hour.requestFocus();
        }
    });

    hour.setInputType(fieldInputType);

    ampm = findViewById(R.id.ampm_spinner);
    final ArrayAdapter methodAdapter = 
ArrayAdapter.createFromResource(getContext(), 
R.array.ampm,android.R.layout.simple_spinner_item);



methodAdapter.setDropDownViewResource
(android.R.layout.simple_spinner_dropdown_item);
    ampm.setAdapter(methodAdapter);
    SimpleDateFormat dateFormat = new SimpleDateFormat("aa");
    String formattedDate = dateFormat.format(new Date());
    if(formattedDate.equals("AM"))
        ampm.setSelection(0);
     else
        ampm.setSelection(1);
}
@Override
public boolean onTouchEvent(final MotionEvent event) {
    if(event.getAction() == MotionEvent.ACTION_UP){
        return performClick();
    }
    return true;
}

现在,我有一个问题是EditTexts根本不起作用 - 当我单击它们时,它们会获得一秒钟的焦点,我看到光标眨了眨眼,然后再次"黑暗"。requestFocus()也不起作用。

如何使这两个edittext像普通的编辑文本一样行动?我实施了Getters和Setter,因此获得并设置该值并不是一个问题,但是我看不到它们正确地行动。

谢谢!

将其更改为

TextView hour;
TextView minute;
hour = findViewById(R.id.hour_input);
minute = findViewById(R.id.minute_input);

这个。

EditText hour;
EditText minute;
hour = (EditText)findViewById(R.id.hour_input);
minute = (EditText)findViewById(R.id.minute_input);

i删除

setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS);

解决了问题。看来我没有正确阅读自己使用的教程。这就是它的作用 - 有人可以解释DescendantFocusability = AfterDescendants吗?

最新更新