NullPointerException:尝试在空对象引用上调用虚拟方法 findViewById(int)'
Posted
技术标签:
【中文标题】NullPointerException:尝试在空对象引用上调用虚拟方法 findViewById(int)\'【英文标题】:NullPointerException: Attempt to invoke virtual method findViewById(int)' on a null object referenceNullPointerException:尝试在空对象引用上调用虚拟方法 findViewById(int)' 【发布时间】:2016-08-05 19:31:09 【问题描述】:我根据Google official tutorial写了关于片段的代码
而且它们几乎相同,但是为什么我仍然遇到找不到TextView
的错误。
它由四个java类和三个布局文件组成。我可能想在风景上工作,棘手的部分是在风景中,对于肖像作品找到。因此,为了便于阅读,我只提供风景代码。
activity_main.xml(土地)
就像演示一样,我的布局-风景仍然存在
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_
android:layout_>
<fragment
android:id="@+id/list_fragment"
class="com.example.jimjay.bookapp.List_fragment"
android:layout_
android:layout_
android:layout_weight="1" />
<fragment
android:id="@+id/content_fragment"
class="com.example.jimjay.bookapp.ContenFragment"
android:layout_
android:layout_
android:layout_weight="3" />
</LinearLayout>
content_view.xml
这用于显示文本
<TextView
android:id="@+id/container_content"
android:layout_
android:layout_
android:padding="8dp"
android:textSize="12dp"
android:textStyle="bold"
xmlns:android="http://schemas.android.com/apk/res/android" />
MainActivity.java
public class MainActivity extends AppCompatActivity implements List_fragment.OnListSelectedListener
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (findViewById(R.id.container) != null)
if (savedInstanceState != null)
return;
List_fragment firstFragment = new List_fragment();
firstFragment.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction().add(R.id.container, firstFragment).commit();
@Override
public void onChapterSelected(int position)
ContenFragment contenFragment=(ContenFragment)getSupportFragmentManager().findFragmentById(R.id.content_fragment);
if (contenFragment != null)
contenFragment.updateContent(position);
else
ContenFragment newFragment = new ContenFragment();
Bundle args = new Bundle();
args.putInt(ContenFragment.ARG_POSITION, position);
newFragment.setArguments(args);
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.container, newFragment);
transaction.addToBackStack(null);
transaction.commit();
List_fragment.java
public class List_fragment extends ListFragment
OnListSelectedListener mCallBack;
interface OnListSelectedListener
void onChapterSelected(int position);
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
int layout=android.R.layout.simple_list_item_activated_1;
setListAdapter(new ArrayAdapter<>(getActivity(),layout,new Book_content().chapters));
@Override
public void onStart()
super.onStart();
if (getFragmentManager().findFragmentById(R.id.list_fragment) != null)
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
@Override
public void onAttach(Context context)
super.onAttach(context);
try
mCallBack=(OnListSelectedListener) context;
catch (ClassCastException e)
throw new ClassCastException(context.toString()+" must implement OnListSelectedListener");
@Override
public void onListItemClick(ListView l, View v, int position, long id)
mCallBack.onChapterSelected(position);
getListView().setItemChecked(position,true);
ContenFragment.java
public class ContenFragment extends Fragment
final static String ARG_POSITION="position";
int mCurrentPosition=-1;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState)
if (savedInstanceState != null)
mCurrentPosition=savedInstanceState.getInt(ARG_POSITION);
return inflater.inflate(R.layout.content_view,container,false);
@Override
public void onStart()
super.onStart();
Bundle args=getArguments();
if (args!= null)
updateContent(args.getInt(ARG_POSITION));
else if (mCurrentPosition != -1)
updateContent(mCurrentPosition);
public void updateContent(int position)
TextView textView = (TextView) getActivity().findViewById(R.id.container_content);
if (textView != null)
textView.setText((new Book_content().contents_string[position]));
else
Log.e("LOG", "The textView is null");
mCurrentPosition = position;
@Override
public void onSaveInstanceState(Bundle outState)
super.onSaveInstanceState(outState);
outState.putInt(ARG_POSITION,mCurrentPosition);
最后一个 Java 文件是 Book_content.class
,它只包含字符串。
所以它在纵向工作,但在横向工作,我无法弄清楚,我发现的问题是ContenFragment.class
中的TextView
引发异常,即为空。但我确实在content_view
中有一个TextView
。这是为什么?帮助
【问题讨论】:
【参考方案1】:试图自己弄清楚,现在我做到了。 奇怪的是还是遇到了EXCEPTION,即使我只是直接在我的类中粘贴了官方示例代码。所以我不得不转向其他实例化。将右侧的片段更改为片段布局,让它与纵向布局。
activity_main.xml(土地)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_
android:layout_>
<fragment
android:id="@+id/list_fragment"
class="com.example.jimjay.bookapp.List_fragment"
android:layout_
android:layout_
android:layout_weight="1" />
<FrameLayout
android:id="@+id/content_fragment_container"
android:layout_
android:layout_
android:layout_weight="2"></FrameLayout>
</LinearLayout>
所以只需使用 FragmentTransaction 来添加 contentFragment。
【讨论】:
以上是关于NullPointerException:尝试在空对象引用上调用虚拟方法 findViewById(int)'的主要内容,如果未能解决你的问题,请参考以下文章
NullPointerException 尝试在空对象引用上调用 method.GoogleMap.setMapType(int)'
数据库错误:“NullPointerException:尝试在空对象引用上调用虚拟方法 getApplicationInfo()...”[重复]
原因:java.lang.NullPointerException:尝试在空对象引用上调用接口方法
java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ActionBar.setNavigationMode(int)”
NullPointerException:尝试在空对象引用上调用虚拟方法 AlertDialog.setTitle(java.lang.CharSequence) [重复]
NullPointerException:尝试在空对象引用上调用虚拟方法“int java.util.ArrayList.size()”