我正在创建一个自定义/扩展的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而被夸大了吗?
答案 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);