【问题标题】:Android: Spinner from ID Is Always NullAndroid:来自 ID 的 Spinner 始终为 Null
【发布时间】:2013-06-27 11:50:24
【问题描述】:

我有一个片段和一个活动。该活动使片段膨胀。片段的 xml 文件包含微调器的 @+id。

在活动的 onCreate 中,我试图从片段中获取微调器。

Spinner mySpinner = (Spinner)findViewById(R.id.mySpinner);

mySpinner 始终以 null 的形式返回。我绝对确定 ID 是正确的。

我该如何解决这个问题?

编辑: 以下是活动的完整 onCreate:

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.newtimer);

    myArray = this.getResources().getStringArray(R.array.myspinner);

    db = new DBAdapter(this);

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    Bundle type = getIntent().getExtras();

    String stringType = type.getString("type");

    if (stringType.equals(A_STRING_HERE))
    {
        MyCustomFragment myFragment = new MyCustomFragment();

        fragmentTransaction.replace(R.id.fragmentContainer, myFragment); // fragmentContainer is a FrameLayout that I use to swap with fragments
        fragmentTransaction.commit();
        fragmentManager.executePendingTransactions();


        //TODO Load active timers
        db.open();

        Cursor myCursor = db.getEntry(0);
        if(myCursor.moveToFirst())
        {
            String curr = myCursor.getString(2);
            Spinner mySpinner = (Spinner)findViewById(R.id.myspinner;
            ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.myspinner,
                    android.R.layout.simple_spinner_item);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

            if (myspinnerr == null)
            {
                Log.d("NewTimerActivity", "spinner is null!");
            }
            myspinner.setAdapter(adapter);

            int i = java.util.Arrays.asList(myArray).indexOf(curr);
            myspinner.setSelection(i);
        }
}

【问题讨论】:

  • 您的setContentView 电话是否在引号上方?
  • 是的,我已经检查过了。我正在做的是将内容视图设置为包含 FrameLayout 的基本 LinearLayout xml 文件。然后将 FrameLayout 替换为来自另一个文件的片段(包含微调器的同一片段)。当然,所有这些都是在引用的行之前调用的。

标签: android android-activity null spinner fragment


【解决方案1】:

默认情况下,微调器会选择其中一项,因此微调器项的位置 0 应禁用。

【讨论】:

    【解决方案2】:

    您应该在您的 Fragment,而不是您的 Activity 中包含此信息。

    试试类似的东西

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

    在您的Fragment 中。原因是实际上拥有视图的是您的片段,而不是活动。

    根据您的 onCreate 进行编辑:

    Spinner mySpinner = (Spinner)myFragment.getView().findViewById(R.id.mySpinner);
    

    【讨论】:

    • 片段中按钮的 onClick 被放入活动类中。我可以成功调用“Spinner spinner = (Spinner)findViewById(R.id.spinner_herbs0);”在活动中的这个 onClick 方法中。
    • 但是我还是需要在activity的onCreate中这样做。
    • 你需要等到片段完全膨胀之后。请发布您的整个 onCreate。
    • 我已按要求发布了我的 onCreate。此外,我在覆盖的 onResume 上尝试了它,它工作正常(微调器不为空)。但是,它有点粗略,如果可能的话,我更愿意在 onCreate 上做。
    • 不幸的是,这不起作用。不过,一切都在 onResume 中有效。我可能只需要在那里做,因为无论如何都会被调用。
    猜你喜欢
    • 2017-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2013-03-27
    • 2018-02-16
    • 2014-06-21
    相关资源
    最近更新 更多