如何在片段布局中创建微调器?
How do I create a spinner in a fragment layout?
我正在跟随 Google 的 spinner example 在 Fragment
中创建一个简单的 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
之后的任何片段生命周期方法,例如 onViewCreated
、onStart
或 onResume
然后如您所述,使用 getActivity()
或 requireActivity()
构建适配器
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(requireActivity(),
R.array.spinner_options,
android.R.layout.simple_spinner_item);
我正在跟随 Google 的 spinner example 在 Fragment
中创建一个简单的 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
之后的任何片段生命周期方法,例如 onViewCreated
、onStart
或 onResume
然后如您所述,使用 getActivity()
或 requireActivity()
构建适配器
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(requireActivity(),
R.array.spinner_options,
android.R.layout.simple_spinner_item);