任何人都可以帮我找出这个程序可能出现的问题。
在onCreate()
方法中,findViewById()
为所有id返回null,这会在以后导致空指针异常。我无法弄清楚findViewById()
无法找到视图的原因。有什么建议吗?
这是主要代码:
public class MainActivity extends Activity {
ViewPager pager;
MyPagerAdapter adapter;
LinearLayout layout1, layout2, layout3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
layout1 = (LinearLayout) findViewById(R.id.first_View);
layout2 = (LinearLayout) findViewById(R.id.second_View);
layout3 = (LinearLayout) findViewById(R.id.third_View);
adapter = new MyPagerAdapter();
pager = (ViewPager) findViewById(R.id.main_pager);
pager.setAdapter(adapter);
}
private class MyPagerAdapter extends PagerAdapter
{
@Override
public int getCount() {
return 3;
}
@Override
public Object instantiateItem(ViewGroup collection, int position) {
LinearLayout l = null;
if (position == 0 )
{
l = layout1;
}
if (position == 1)
{
l = layout2;
}
if (position == 2)
{
l = layout3;
}
collection.addView(l, position);
return l;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return (view==object);
}
@Override
public void destroyItem(ViewGroup collection, int position, Object view) {
collection.removeView((View) view);
}
}
}
相关的XML文件:
activity_main layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#a4c639">
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/main_pager"/>
</LinearLayout>
activity_first layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/first_View">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<Button
android:id="@+id/button1"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>
activity_second layout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/second_View">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</LinearLayout>
activity_third布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/third_View">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</LinearLayout>
答案 0 :(得分:78)
findViewById()
返回一个View,如果它存在于setContentView()
中提供的布局中,否则它将返回null,这就是发生在你身上的事情。
示例如果您setContentView(R.layout.activity_first);
然后致电findViewById(R.id.first_View);
,它将返回一个您的布局视图。
但是,如果您致电findViewById(R.id.second_View);
,则会返回null
,因为activity_first.xml
布局中没有名为@+id/second_View
的视图。
答案 1 :(得分:2)
您尝试获取的视图未在activity_main
布局中定义。您需要以编程方式夸大您尝试添加到寻呼机的视图.-
@Override
public Object instantiateItem(ViewGroup collection, int position) {
LinearLayout l = null;
if (position == 0) {
l = (LinearLayout) View.inflate(this, R.layout.activity_first, null);
}
if (position == 1) {
l = (LinearLayout) View.inflate(this, R.layout.activity_second, null);
}
if (position == 2) {
l = (LinearLayout) View.inflate(this, R.layout.activity_third, null);
}
collection.addView(l, position);
return l;
}
答案 2 :(得分:2)
重点增加
对于Activity类中的那些情况。
Activity.findViewById(int id)
查找由<{>
id
中处理的XML中的onCreate(Bundle)
属性标识的视图。
否则,例如片段,适配器,来自View
的{{1}}等
LayoutInflater
使用给定的
View.findViewById(int id)
查找子视图。如果此视图具有给定的id,请返回此视图。
无论哪种情况,
<强>返回强>
如果找到该视图或id
则。
现在,重新检查您的XML文件。确保将正确的值放入null
或setContentView
。
如果是活动,请在inflater.inflate
之后致电findViewById
。
然后,确保在该布局中有setContentView
找到的视图。确保android:id="@+id/..."
位于+
,这会将资源添加到@+id
值,以确保您可以从Java中找到它。
答案 3 :(得分:1)
在访问之前将这些视图添加到寻呼机适配器。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
adapter = new MyPagerAdapter();
pager = (ViewPager) findViewById(R.id.main_pager);
pager.setAdapter(adapter);
layout1 = (LinearLayout) findViewById(R.id.first_View);
layout2 = (LinearLayout) findViewById(R.id.second_View);
layout3 = (LinearLayout) findViewById(R.id.third_View);
}
寻呼机适配器中的:
public Object instantiateItem(View collection, int position) {
if(position == 0){
View layout = inflater.inflate(R.layout.activity_first, null);
((ViewPager) collection).addView(layout);
return layout;
}
... and so forth.
}
从这里你可以通过findViewById访问它们。
答案 4 :(得分:1)
有时您需要在Eclipse中清理项目(Project - Clean ..)。
答案 5 :(得分:1)
我今天收到了这个错误,清除起来很简单,我“面对面”。
尝试将UI元素添加到 res / layout-port目录中的布局xml文件中!!!
答案 6 :(得分:1)
就我而言,这是我的一个愚蠢的错误。我在OnCreate方法中编写了代码,但是高于 setContentView
代码行。一旦我将代码移到此行下方,应用程序就开始正常工作了。
setContentView(R.layout.activity_main);
答案 7 :(得分:0)
@Warlock上面说的是对的,你应该以正确的方式初始化LinearLayout layout1,layout2,layout3:
LinearLayout layout1 = (LinearLayout) View.inflate(this, R.layout.first_View, null);
LinearLayout layout2 = (LinearLayout) View.inflate(this, R.layout.second_View, null);
LinearLayout layout3 = (LinearLayout) View.inflate(this, R.layout.third, null);
希望我的建议帮助你
答案 8 :(得分:0)
在Android中,findViewById(R.id.some_id)
在布局集中查找视图时有效。
也就是说,如果您设置了布局说:
setContentView(R.layout.my_layout);
只能在此布局中找到视图(my_layout)。
在您的代码layout1
中,layout2
,layout3
都有三种不同的布局,并且未将其设置为活动。
答案 9 :(得分:0)
findViewById
方法必须找到布局中的内容(您在setContentView
中调用的内容)
答案 10 :(得分:-1)
当您在 XML 文件中具有相同名称的多个组件时,也会产生此问题。即使它们是不同的布局文件,您也应该给每个元素一个唯一的名称。 发生此错误是因为您在另一个布局文件中有一个同名的 XML 元素,而 android studio 正在尝试访问该元素并显示此错误