如何在一个片段中显示我的微调框

时间:2019-04-26 19:32:55

标签: java android spinner

我正在创建一个应用程序,此刻,我已经创建了两个片段,它们将成为一种“导航”类的东西。在两个片段的第二个片段上,我放置了一个微调器,用户可以在该微调器上选择特定的选项。所有微调器都有唯一的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) {

    }
}

微调器应该在一个片段中工作,然后我想再重复几次

2 个答案:

答案 0 :(得分:1)

这是您要处理的片段,而不是活动。 Fragment不扩展ContextView类,并且没有此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也存在问题。
Csongi77答案中所述,您需要正确地实例化适配器。同样,该片​​段不能用作上下文,您必须为此使用包含活动:

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

ArrayAdapter.createFromResource创建并返回一个新适配器,当前您只是通过不保存其引用而立即将其丢弃。

答案 1 :(得分:0)

我认为首先您应该像这样实例化适配器:ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(getActivity(), R.array.insulin, android.R.layout.simple_spinner_item);请让我知道它是否有效。此致Csongi