如何在一个片段中显示我的微调器
How to show my spinner within one fragment
我正在创建一个应用程序,目前,我已经创建了两个片段,它们将成为 "navigation" 之类的东西。在这两个片段中的第二个片段中,我放了一个微调器,用户可以在其中 select 一个特定的选项。所有微调器都有唯一 ID,但无法解析 findViewById 方法
所有字符串都在字符串 xml 文件中,当我在我的测试应用程序中尝试这个微调器时,它起作用了
public class Frag2 extends Fragment implements AdapterView.OnItemSelectedListener{
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.frag2_layout, container, false);
Spinner spinner = findViewById (R.id.spinner1);
ArrayAdapter.createFromResource(getActivity(), R.array.insulin, android.R.layout.simple_spinner_item);
ArrayAdapter<CharSequence> adapter;
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(this);
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String text = parent.getItemAtPosition(position).toString();
Toast.makeText(parent.getContext(), text, Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}
微调器应该在一个片段内工作,然后我想再使用几次
我想首先你应该像这样实例化适配器:ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), R.array.insulin, android.R.layout.simple_spinner_item);
如果它有效,请告诉我。此致 Csongi
这是您要处理的片段,而不是 activity。 Fragment
没有扩展 Context
或 View
类 并且没有这个 findViewById
方法。
您应该做的是将您的代码从 onCreateView
移动到 onViewCreated
,它获取对根视图的引用作为参数。然后使用相同的方法,但使用该视图,如下所示:
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
Spinner spinner = view.findViewById(R.id.spinner1);
...
}
您可以做的另一件事是替换:
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.frag2_layout, container, false);
Spinner spinner = findViewById (R.id.spinner1);
// I'm not sure how you didn't see all errors when writing code after a return statement.
...
}
有:
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag2_layout, container, false);
Spinner spinner = view.findViewById(R.id.spinner1);
...
return view; // after finishing all logic.
}
更新:
没看到ArrayAdapter
也有问题。
如 回答中所述,您需要正确实例化适配器。同样,该片段不能用作上下文,您必须为此使用包含 activity:
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), R.array.insulin, android.R.layout.simple_spinner_item);
ArrayAdapter.createFromResource
创建并 returns 一个新的适配器,目前您只是通过不保存它的引用来立即处理它。
我正在创建一个应用程序,目前,我已经创建了两个片段,它们将成为 "navigation" 之类的东西。在这两个片段中的第二个片段中,我放了一个微调器,用户可以在其中 select 一个特定的选项。所有微调器都有唯一 ID,但无法解析 findViewById 方法
所有字符串都在字符串 xml 文件中,当我在我的测试应用程序中尝试这个微调器时,它起作用了
public class Frag2 extends Fragment implements AdapterView.OnItemSelectedListener{
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.frag2_layout, container, false);
Spinner spinner = findViewById (R.id.spinner1);
ArrayAdapter.createFromResource(getActivity(), R.array.insulin, android.R.layout.simple_spinner_item);
ArrayAdapter<CharSequence> adapter;
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(this);
}
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String text = parent.getItemAtPosition(position).toString();
Toast.makeText(parent.getContext(), text, Toast.LENGTH_SHORT).show();
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
}
微调器应该在一个片段内工作,然后我想再使用几次
我想首先你应该像这样实例化适配器:ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), R.array.insulin, android.R.layout.simple_spinner_item);
如果它有效,请告诉我。此致 Csongi
这是您要处理的片段,而不是 activity。 Fragment
没有扩展 Context
或 View
类 并且没有这个 findViewById
方法。
您应该做的是将您的代码从 onCreateView
移动到 onViewCreated
,它获取对根视图的引用作为参数。然后使用相同的方法,但使用该视图,如下所示:
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
Spinner spinner = view.findViewById(R.id.spinner1);
...
}
您可以做的另一件事是替换:
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.frag2_layout, container, false);
Spinner spinner = findViewById (R.id.spinner1);
// I'm not sure how you didn't see all errors when writing code after a return statement.
...
}
有:
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.frag2_layout, container, false);
Spinner spinner = view.findViewById(R.id.spinner1);
...
return view; // after finishing all logic.
}
更新:
没看到ArrayAdapter
也有问题。
如
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), R.array.insulin, android.R.layout.simple_spinner_item);
ArrayAdapter.createFromResource
创建并 returns 一个新的适配器,目前您只是通过不保存它的引用来立即处理它。