简体   繁体   中英

Android NullPointerException. Why?

I'am new in android programming, and i have next problem: In my fragment class i need to do some action when user has clicked on button. Here is my code, he is very simple:

public class InboxFragment extends Fragment{
    private ListView ll;
    @Override

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.inbox_fragment, container, false);
    }

    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        Button filter_bt;
        filter_bt = (Button) getView().findViewById(R.id.filter_button);
        filter_bt.setOnClickListener((OnClickListener) this);
    }
}

And here is my code of layout file:

<?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:orientation="vertical" >

    <Button
        android:id="@+id/filter_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/red"
        android:text="Filter by date"
        android:textColor="@color/white" />

</LinearLayout>

Here is my logs:

FATAL EXCEPTION: main
java.lang.NullPointerException
    at com.example.android.navigationdrawerexample.InboxFragment.onCreate(InboxFragment.java:29)
    at android.app.Fragment.performCreate(Fragment.java:1673)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:872)
    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1075)
    at android.app.BackStackRecord.run(BackStackRecord.java:682)
    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1455)
    at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441)
    at android.os.Handler.handleCallback(Handler.java:725)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5306)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:511)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
    at dalvik.system.NativeStart.main(Native Method)

LOGS (2)

04-22 17:00:14.760: E/AndroidRuntime(17308): FATAL EXCEPTION: main
04-22 17:00:14.760: E/AndroidRuntime(17308): java.lang.ClassCastException: com.example.android.navigationdrawerexample.InboxFragment cannot be cast to android.view.View$OnClickListener
04-22 17:00:14.760: E/AndroidRuntime(17308):    at com.example.android.navigationdrawerexample.InboxFragment.onViewCreated(InboxFragment.java:35)
04-22 17:00:14.760: E/AndroidRuntime(17308):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:917)
04-22 17:00:14.760: E/AndroidRuntime(17308):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1075)
04-22 17:00:14.760: E/AndroidRuntime(17308):    at android.app.BackStackRecord.run(BackStackRecord.java:682)
04-22 17:00:14.760: E/AndroidRuntime(17308):    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1455)
04-22 17:00:14.760: E/AndroidRuntime(17308):    at android.app.FragmentManagerImpl$1.run(FragmentManager.java:441)
04-22 17:00:14.760: E/AndroidRuntime(17308):    at android.os.Handler.handleCallback(Handler.java:725)
04-22 17:00:14.760: E/AndroidRuntime(17308):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-22 17:00:14.760: E/AndroidRuntime(17308):    at android.os.Looper.loop(Looper.java:137)
04-22 17:00:14.760: E/AndroidRuntime(17308):    at android.app.ActivityThread.main(ActivityThread.java:5306)
04-22 17:00:14.760: E/AndroidRuntime(17308):    at java.lang.reflect.Method.invokeNative(Native Method)
04-22 17:00:14.760: E/AndroidRuntime(17308):    at java.lang.reflect.Method.invoke(Method.java:511)
04-22 17:00:14.760: E/AndroidRuntime(17308):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
04-22 17:00:14.760: E/AndroidRuntime(17308):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
04-22 17:00:14.760: E/AndroidRuntime(17308):    at dalvik.system.NativeStart.main(Native Method)

All code are very simple, button exist, but why my app crashing?

Thank's to all.

getView() returns null before onCreateView returns. Move that snippet inside onViewCreated

onCreate() is called before onCreateView() , so you haven't draw the layout when you're trying to get it.

Get the code from onCreate and move it to onViewCreated()

http://developer.android.com/reference/android/app/Fragment.html#Lifecycle

Regards!

can you try something like

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    View content = inflater.inflate(R.layout.inbox_fragment, container, false);
    Button filter_bt;
    filter_bt = (Button) content.findViewById(R.id.filter_button);
    filter_bt.setOnClickListener((OnClickListener) this);
    return content;
}

public void onCreate(Bundle savedInstanceState) 
{
    super.onCreate(savedInstanceState);
}

bcause onCreate is called before onCreateView. It give you a nullpointerexception because your getView() hasn't been defined yet.

I have found problem. There is right code of class:

public class InboxFragment extends Fragment implements View.OnClickListener{
    private ListView ll;
    @Override

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        return inflater.inflate(R.layout.inbox_fragment, container, false);
    }

    public void onViewCreated(View view, Bundle state)
    {
        super.onViewCreated(view, state);
        Button filter_bt;

        filter_bt = (Button) view.findViewById(R.id.filter_button);
        filter_bt.setOnClickListener(this);
    }

    public void OnClick(View view)
    {

    }

    @Override
    public void onClick(View arg0) {
        // TODO Auto-generated method stub

    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM