自定义布局中的EditText不起作用

时间:2018-02-27 11:57:44

标签: android

我想模仿新的奥利奥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" />

我还创建了支持类(下面没有包含的setter和getter:

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根本不起作用 - 当我点击它们时,它们会在一秒钟内获得焦点,我看到光标闪烁,然后去了#34;黑暗&# 34;再次。 requestFocus()也不起作用。

如何让这两个edittext表现得像普通的编辑文本?我实现了getter和setter,因此获取和设置值不会成为问题,但我不认为它们正常运行。

谢谢!

2 个答案:

答案 0 :(得分:1)

将此更改为

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);

答案 1 :(得分:0)

我删除了

setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS);

这解决了问题。好像我没有正确阅读我正在使用的教程。 这是它的作用 - Can someone explain descendantFocusability = afterDescendants?