android扩展LinearLayout,使用LayoutInflater添加XML,findViewById为null

时间:2011-03-08 22:57:56

标签: android nullpointerexception

我正在创建一个自定义/扩展的LinearLayout,我将其添加到ViewAnimator中,显然是为了实现很酷的效果。

所以我的主Activity有一个ViewAnimator,我创建了一个我一直在研究的这个NavigationView的实例,并将它作为子视图添加到ViewAnimator中。 NavigationView本身使用LayoutInflater来抓取我制作的接口的xml并将其附加到自身。

然后我尝试找到这个我知道具有正确id的微调器,它总是返回null。如果我使用这个XML作为Activity的主要内容视图,我找到微调器没有问题。

这是我的代码:

  public class NavigationView extends LinearLayout {

    public NavigationView(Context context) {
        super(context);
        addView(context);
    }

    public NavigationView(Context context, AttributeSet attrs) {
        super(context, attrs);
        addView(context);
    }

    public void addView(Context context) {

        LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.nav, this, true);

        Spinner spinner = (Spinner) findViewById(R.id.nav_spinner);
        if(spinner == null) Log.v("spinner", "null");

    } 
   }

所以我总是在LogCat中看到“spinner”为“null”。

我看到我创建的界面添加到了屏幕上,但它让我疯狂为什么它不会被id找到这个对象。

可能因为它没有正确分配ID而被夸大了吗?

3 个答案:

答案 0 :(得分:1)

你在错误的时间给你充气。删除addView方法,覆盖onFinishInflate()方法并在此处进行通胀。 e.g

@Override
    protected void onFinishInflate() {
            super.onFinishInflate();
            ((Activity)getContext()).getLayoutInflater().inflate(R.layout.nav, this);

             Spinner spinner = (Spinner) findViewById(R.id.nav_spinner);
             if(spinner == null) Log.v("spinner", "null");
    }

答案 1 :(得分:1)

所以不确定为什么,给出一些好的建议和解决代码我最终得到它的工作:

public class NavigationView extends LinearLayout {

    public NavigationView(Context context) {

        super(context);
        this.init(context);

    }

    public void init(Context context) {

        LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.nav, this, true);

        Spinner spinner = (Spinner) v.findViewById(R.id.navSpinner);
        if(spinner != null) {

            ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context, R.array.nav_sections, android.R.layout.simple_spinner_item);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            spinner.setAdapter(adapter);
        }

    }

}

它似乎是完全相同的代码,也许我只需要在我拿出下划线后清理我的项目?

答案 2 :(得分:0)

您需要在已膨胀的视图上调用findViewById。这意味着你需要尝试这个:

Spinner spinner = (Spinner) v.findViewById(R.id.nav_spinner);