0

我有一些 EditText,我想以编程方式控制它们的焦点顺序。但是,默认情况下,EditText 会在触摸时获得焦点,因此这会破坏顺序。

我试图使 EditText 的 focusableInTouchMode 为 false,但它从未获得焦点,就像它禁用了可聚焦的一样。

那么,有一种方法可以禁用它的 focusableInTouchMode 但仍然可以聚焦?

4

1 回答 1

0

希望这是不可能的艾伦。解决方法是,创建一个 0dp 高度和 0dp 宽度的假编辑文本。

      <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:fitsSystemWindows="true">
        <EditText
            android:id="@+id/edit_fake"
            android:layout_width="0dp"
            android:layout_height="0dp"
            android:focusable="true"
    
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            />
    
        <EditText
            android:id="@+id/edit_title"
            android:focusableInTouchMode="true"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
    
            android:layout_margin="32dp"/>
        <EditText
            android:id="@+id/edit_name"
            android:focusableInTouchMode="true"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            app:layout_constraintTop_toBottomOf="@id/edit_title"
            app:layout_constraintStart_toStartOf="parent"
    
            android:layout_margin="32dp"/>
        <Button
            android:id="@+id/btn_done"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="done"
            app:layout_constraintTop_toBottomOf="@id/edit_name"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"/>
    </androidx.constraintlayout.widget.ConstraintLayout>

//activity code


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

       fake=findViewById(R.id.edit_fake);
       name=findViewById(R.id.edit_name);
       title=findViewById(R.id.edit_title);
       done=findViewById(R.id.btn_done);

       fake.setOnFocusChangeListener(this);
       name.setOnFocusChangeListener(this);
       title.setOnFocusChangeListener(this);

       done.setOnClickListener(this);


    }


    @Override
    public void onClick(View v) {
        if(v.getId()==R.id.btn_done){
            //clear focus
            name.clearFocus();
            fake.clearFocus();
            fake.requestFocus();

        }
    }

    @Override
    public void onFocusChange(View v, boolean hasFocus) {

        if(v.getId()==R.id.edit_name){
            Log.d("onFocusChangename:", "name");
       }
        if(v.getId()==R.id.edit_fake){
            Log.d("onFocusChangenfake:", "fake");
        }

        if(v.getId()==R.id.edit_title){
            Log.d("onFocusChangenfake:", "tit");
        }
    }
于 2021-05-21T12:27:24.387 回答