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()”