如何在片段布局中创建微调器?

How do I create a spinner in a fragment layout?

我正在跟随 Google 的 spinner exampleFragment 中创建一个简单的 Spinner。这是我到目前为止所做的:

fragment_home.xml

<Spinner
    android:id="@+id/spinner"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_marginTop="6dp"
    app:layout_constraintEnd_toEndOf="@+id/textView5"
    app:layout_constraintStart_toStartOf="@+id/textView5"
    app:layout_constraintTop_toBottomOf="@+id/textView5" />

HomeFragment.java

public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    ...
    Spinner spinner = (Spinner) getView().findViewById(R.id.spinner);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), R.array.spinner_options, android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinner.setAdapter(adapter);
}

strings.xml

<resources>
    ...
    <string-array name="spinner_options">
        <item>Round-robin</item>
        <item>Double round-robin</item>
        <item>Swiss</item>
        <item>Knockout</item>
        <item>Team round-robin</item>
        <item>Team Swiss</item>
        <item>Team knockout</item>
        <item>Match</item>
    </string-array>
</resources>

当我尝试构建应用程序时,出现错误:

error: incompatible types: HomeFragment cannot be converted to Context
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this
                                                                         ^

我在 this post 中读到我必须传递 Activity 作为第一个参数而不是片段,所以我尝试用 getActivity() 替换 this 然后this.getActivity()。在这两种情况下,应用程序都会成功构建,但不会 运行.

我是不是做错了什么?有人可以指出我的错误吗?

您不应该在 onCreateView 中使用 getView(),因为片段视图尚未创建。因为实际上 onCreateView returns 要创建它的视图。

所以,下面这行代码会导致NPE

Spinner spinner = (Spinner) getView().findViewById(R.id.spinner);

如果你想在 onCreateView 中设置微调器,那么你需要先用

膨胀视图
 View view = inflater.inflate(R.layout.my_fragment_layout, container, false);
 Spinner spinner = view.findViewById(R.id.spinner);

您可以将 getView() 用于 onCreateView 之后的任何片段生命周期方法,例如 onViewCreatedonStartonResume

然后如您所述,使用 getActivity()requireActivity() 构建适配器

ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(requireActivity(), 
                             R.array.spinner_options, 
                             android.R.layout.simple_spinner_item);