我正在尝试创建一种单选风格的Preference
,用户可以在其中单击一个选项,然后将其分配为Preference
的新值:
但是,当我单击一个选项时,会选择所有三个选项:
这是我的布局:
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")
}
}
}
答案 0 :(得分:0)
这可能是因为所有三个按钮都位于一个首选项下,当您设置OnPreferenceClickListener
时,它会选择整个首选项以及包含整个布局的首选项。
因此,与其设置OnPreferenceClickListener
,不如尝试获取父视图,并分别在这TextView
上设置点击侦听器,然后从那里更新首选项的值。
或者您也可以将布局xml文件中每个onClick
的{{1}}属性设置为所需的功能。
要获得此首选项的视图,可以使用
TextView
或者,使用getView方法并为两个参数提供null:
View preferenceView = getListView().getChildAt(preference.getOrder());
如果您使用AndroidX库作为首选项,则没有View preferenceView = preference.getView(null, null);
方法,因此唯一的选择是创建自定义的Preference类并在其中处理视图:
getView
然后像下面这样在您的preference.xml中使用它:
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);
...
}
}