【问题标题】:How do I create a spinner in a fragment layout?如何在片段布局中创建微调器?
【发布时间】:2021-01-01 18:54:04
【问题描述】:

我正在关注 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() 替换。在这两种情况下,应用程序都成功构建但没有运行。

我在这里做错了吗?谁能指出我的错误?

【问题讨论】:

  • does not run? 表示有崩溃报告?还是不符合您的期望?
  • 应用程序根本没有运行。
  • 所以肯定有崩溃报告什么的..我们可以看看它
  • 这里是:java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.myapp/com.example.myapp.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference.
  • 这和getView().findViewById(R.id.spinner)有关系吗?谷歌的例子是关于在一个活动中创建一个微调器,所以他们没有使用getView()

标签: android android-fragments android-spinner


【解决方案1】:

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

所以,下面这行代码会导致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);

【讨论】:

  • 实际上视图早在onCreateView() 中就已经被夸大了。谢谢,这行得通。
  • @WaisKamal 欢迎.. 对于片段生命周期方法,您可以查看here
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 2017-12-21
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多