Создание предпочтения в стиле радио - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь создать радио стиль Preference, где пользователь может щелкнуть опцию, которая затем назначается в качестве нового значения Preference:

enter image description here

однако, когда я нажимаю один из вариантов, выбираются все 3 варианта:

enter image description here

Вот мой макет:

preferences.xml

<Preference
    android:layout="@layout/preference_gender"
    android:key="seeking"
    android:title="Seeking"/>

preference_gender.xml

    <androidx.appcompat.widget.AppCompatTextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/seeking"
        android:singleLine="true"
        android:padding="10dp"
        android:textSize="20sp"
        android:textColor="@color/colorIcons"
        android:ellipsize="marquee"
        android:fadingEdge="horizontal"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toTopOf="@id/male"/>

    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/male"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toStartOf="@id/female"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:textSize="@dimen/settings_textSize"
        android:text="Male"
        android:gravity="center"
        android:background="@drawable/settings_gender"
        android:padding="@dimen/settings_box_selection_padding"
        android:paddingStart="@dimen/button_horizontal_padding"
        android:paddingEnd="@dimen/button_horizontal_padding"
        android:textColor="@color/colorPrimaryDark"/>

    <androidx.appcompat.widget.AppCompatTextView
        android:id="@+id/female"
        app:layout_constraintStart_toEndOf="@+id/male"
        app:layout_constraintEnd_toStartOf="@id/both"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:textSize="@dimen/settings_textSize"
        android:text="Female"
        android:gravity="center"
        android:padding="@dimen/settings_box_selection_padding"
        android:background="@drawable/settings_gender"
        android:paddingStart="@dimen/button_horizontal_padding"
        android:paddingEnd="@dimen/button_horizontal_padding"
        android:textColor="@color/colorPrimaryDark"/>

    <androidx.appcompat.widget.AppCompatTextView
        app:layout_constraintStart_toEndOf="@id/female"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        android:id="@+id/both"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:textSize="@dimen/settings_textSize"
        android:text="Both"
        android:gravity="center"
        android:padding="@dimen/settings_box_selection_padding"
        android:background="@drawable/settings_gender"
        android:paddingStart="@dimen/button_horizontal_padding"
        android:paddingEnd="@dimen/button_horizontal_padding"
        android:textColor="@color/colorPrimaryDark"/>

</androidx.constraintlayout.widget.ConstraintLayout>

Поэтому я хочу иметь возможность щелкнуть текстовое представление, а затем получить его значение вPreference.OnPreferenceClickListener.

Есть идеи как?

РЕДАКТИРОВАТЬ:

class PreferencesFragment : PreferenceFragmentCompat(), View.OnClickListener {   

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
    val genderPreference: Preference = findPreference("seeking")!!
    val parentView = listView.getChildAt(genderPreference.order)
    val childView = parentView.findViewById<TextView>(R.id.male) // NullPointerException
    }

    override fun onClick(v: View?) {
        Log.d(TAG, "clicked") // doesn't log
        when (v?.id){
            R.id.male -> Log.d(TAG, "male")
        }
    }

}

1 Ответ

0 голосов
/ 23 мая 2019

Вероятно, это связано с тем, что все три кнопки находятся под одним элементом предпочтений. Когда вы устанавливаете OnPreferenceClickListener, он выбирает все предпочтения с макетом, который вы включили в целом.

Таким образом, вместо установки OnPreferenceClickListener вы должны попытаться получить родительское представление и настроить прослушиватели щелчков на этих TextView отдельно и оттуда обновить значение предпочтения.

Или вы можете просто установить атрибуты onClick каждого TextView в файле макета XML для нужных вам функций.

Чтобы получить представление этого предпочтения, вы можете использовать что-то вроде

View preferenceView = getListView().getChildAt(preference.getOrder());

Или использовать метод getView и предоставить оба параметра со значением null:

View preferenceView = preference.getView(null, null);

Если вы используете библиотеку AndroidX для предпочтения,тогда нет никакого метода getView, поэтому единственным вариантом будет создание пользовательского класса Preference и обработка там представлений:

public class CustomPreference extends Preference {
    public CustomPreference(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onBindView(View rootView) {
        super.onBindView(rootView);

        View myView = rootView.findViewById(R.id.myViewId);
        // get your textViews from myView
        TextView maleText = myView.findViewById(R.id.male);
        ...
    }
}

Затем используйте его в файле preference.xml следующим образом:

<your.package.CustomPreference
    android:key="your_key"
    android:layout="@layout/your_layout" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...