1

Currently I am working on the communication between Fragment and Activity in Android. What I want to achieve here is set onClickListener on a button in the Fragment. However, NPE occurs and I can not find out why. There are many similar questions on the stack flow but I did not find one that works for me. Following are my code and the logcat. Have been stuck here for a while and hope someone can help me out!

Logcat:

> 04-14 17:53:02.163 15136-15136/? E/AndroidRuntime: java.lang.RuntimeException: Unable to start activity
> ComponentInfo{com.example.ivylin.corewar/com.example.ivylin.corewar.assistantWidgets.WarriorBattleSelfScreen}:
> android.view.InflateException: Binary XML file line #7: Error
> inflating class fragment
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2298)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.ActivityThread.access$800(ActivityThread.java:144)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5221)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:  Caused by: android.view.InflateException: Binary XML file line #7: Error
> inflating class fragment
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:763)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.view.LayoutInflater.rInflate(LayoutInflater.java:806)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:365)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:256)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at com.example.ivylin.corewar.assistantWidgets.WarriorBattleSelfScreen.onCreate(WarriorBattleSelfScreen.java:36)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.Activity.performCreate(Activity.java:5933)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.ActivityThread.access$800(ActivityThread.java:144) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5221) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void
> android.widget.Button.setOnClickListener(android.view.View$OnClickListener)'
> on a null object reference
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at com.example.ivylin.corewar.assistantWidgets.WarriorBattleFragment.onCreateView(WarriorBattleFragment.java:46)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.Fragment.performCreateView(Fragment.java:2053)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:870)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1045)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.FragmentManagerImpl.addFragment(FragmentManager.java:1147)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2116)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.Activity.onCreateView(Activity.java:5282)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.support.v4.app.BaseFragmentActivityHoneycomb.onCreateView(BaseFragmentActivityHoneycomb.java:34)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:79)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:733)
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.view.LayoutInflater.rInflate(LayoutInflater.java:806) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:504) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:414) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.view.LayoutInflater.inflate(LayoutInflater.java:365) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.support.v7.app.AppCompatDelegateImplV7.setContentView(AppCompatDelegateImplV7.java:256) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:109) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at com.example.ivylin.corewar.assistantWidgets.WarriorBattleSelfScreen.onCreate(WarriorBattleSelfScreen.java:36) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.Activity.performCreate(Activity.java:5933) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2251) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2360) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.ActivityThread.access$800(ActivityThread.java:144) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1278) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:102) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5221) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899) 
>     04-14 17:53:02.163 15136-15136/? E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)

It seems that the logcat mainly tells that the button bOK is null. View detail code below.

My Fragment:

public class WarriorBattleFragment extends Fragment implements  View.OnClickListener {
private RecyclerView recyclerView;
private WarriorBattleAdapter adapter;

EditText nP1;
EditText nP2;
Button bStart;
static private int click;

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
    View layout = inflater.inflate(R.layout.activity_warrior_self_battle_recyclerview, container, false);
    recyclerView = (RecyclerView) layout.findViewById(R.id.recycler_view);
    LinearLayoutManager layoutManager;

    bStart = (Button) recyclerView.findViewById(R.id.bOK);
    nP1 = (EditText) recyclerView.findViewById(R.id.nP1);
    nP2 = (EditText) recyclerView.findViewById(R.id.nP2);
    bStart.setOnClickListener(this);

    layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
    recyclerView.setLayoutManager(layoutManager);
    adapter = new WarriorBattleAdapter(getActivity());
    recyclerView.setAdapter(adapter);
    return layout;
}


@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.bStart:
            if (UserInformation.selectedBW[0].equals("") && UserInformation.selectedBW[1].equals("")) {
                Toast.makeText(getActivity().getApplicationContext(), "Please Choose A Warrior", Toast.LENGTH_SHORT).show();
            } else {
                click++;
                if (click == 1) {
                    nP1.setText(UserInformation.selectedBW[0]);
                    adapter.setAdded(1);
                } else if (click == 2) {
                    bStart.setText("BATTLE!");
                } else if (click == 3) {
                    Toast.makeText(getActivity().getApplicationContext(), "WARRIOR FILES UPLOADING", Toast.LENGTH_SHORT).show();
                }
            }
            if (!UserInformation.selectedBW[0].equals("")) {
                Intent intent = new Intent(getActivity().getApplicationContext(), DemoDisplay.class);
                intent.putExtra("wName", UserInformation.selectedBW[0]);
                intent.putExtra("MODE", UserInformation.selectedBW[0]);
                startActivity(intent);

            } else {
                Toast.makeText(getActivity().getApplicationContext(), "Please select one warrior", Toast.LENGTH_SHORT).show();
            }
            break;
    }

}
}

My Activity:

public class WarriorBattleSelfScreen extends AppCompatActivity implements View.OnClickListener {
Button bBack;
Intent intent;
static int click;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // set to full screen
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_warrior_battle_self_screen);
    bBack = (Button) findViewById(R.id.bBack);

    // THIS PART IS FOR TEST
    UserInformation.empty = false;
    WarriorCardEntity imp = new WarriorCardEntity();
    imp.title = "Imp";
    imp.image = R.drawable.w9;
    UserInformation.dataContainer.put(0, imp);
    WarriorCardEntity rave = new WarriorCardEntity();
    rave.title = "Rave";
    rave.image = R.drawable.w10;
    UserInformation.dataContainer.put(1, rave);
    WarriorCardEntity lin = new WarriorCardEntity();
    lin.title = "lin";
    lin.image = R.drawable.w20;
    UserInformation.dataContainer.put(2, lin);

    bBack.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.bBack:
            finish();
            break;
    }
}
}

XML in Fragment:

activity_warrior_self_battle_recyclerview

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    android:screenOrientation="landscape"
    >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerInParent="true">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentBottom="true">
        </android.support.v7.widget.RecyclerView>


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="P1: "
            android:textSize="20sp"
            android:textColor="@color/white"
            android:id="@+id/tP1"
            />
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/nP1"
            android:layout_toRightOf="@+id/tP1"
            android:hint="WARRIOR1"
            android:textColor="@color/white"
            android:textColorHint="@color/white"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="P2: "
            android:layout_marginLeft="400dp"
            android:textSize="20sp"
            android:textColor="@color/white"
            android:id="@+id/tP2"
            />
        <EditText
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/nP2"
            android:layout_toRightOf="@+id/tP2"
            android:layout_alignParentRight="true"
            android:hint="WARRIOR2"
            android:textColor="@color/white"
            android:textColorHint="@color/white"/>

        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="OK"
            android:background="@drawable/button"
            android:textColor="@color/white"
            android:id="@+id/bOK"
            android:layout_marginRight="33dp"
            android:layout_marginEnd="33dp"
            android:layout_marginBottom="0dp"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true" />


    </RelativeLayout>
</RelativeLayout>

XML in Activity-- activity_warrior_battle_self_screen

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:screenOrientation="landscape"
    android:background="@drawable/background_gene">

    <fragment class="com.example.ivylin.corewar.assistantWidgets.WarriorBattleFragment"
        android:id="@+id/b_self_fragment"
        android:layout_width="match_parent"
        android:layout_height="320dp"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/Add"
        android:layout_toEndOf="@+id/Add"
        android:layout_marginLeft="30dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Back"
        android:background="@drawable/button"
        android:textColor="@color/white"
        android:id="@+id/bBack"
        android:layout_marginLeft="33dp"
        android:layout_marginStart="33dp"
        android:layout_marginBottom="20dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

</RelativeLayout>
Ivy Lin
  • 123
  • 1
  • 12

3 Answers3

1

You're calling findViewById() on the RecyclerView.

You need to call it on your root view instead:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstance) {
    View layout = inflater.inflate(R.layout.activity_warrior_self_battle_recyclerview, container, false);
    recyclerView = (RecyclerView) layout.findViewById(R.id.recycler_view);
    LinearLayoutManager layoutManager;


    //change to layout.findViewById():
    bStart = (Button) layout.findViewById(R.id.bOK); //modified
    nP1 = (EditText) layout.findViewById(R.id.nP1); //modified
    nP2 = (EditText) layout.findViewById(R.id.nP2); //modified
    bStart.setOnClickListener(this);

    layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
    recyclerView.setLayoutManager(layoutManager);
    adapter = new WarriorBattleAdapter(getActivity());
    recyclerView.setAdapter(adapter);
    return layout;
}
Daniel Nugent
  • 43,104
  • 15
  • 109
  • 137
0

Yes, your call to recyclerView.findViewById(R.id.bOK); returns null. This is because there is no button with id 'bOK' in your ViewGroup recyclerView, in which you are trying to find the button with findViewById().

In your Layout you open and close the RecyclerView-tag instantly:

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignParentBottom="true">
</android.support.v7.widget.RecyclerView>

That was probably just by accident. You should close the tag not until after your button, like this - if the button should be in the RecyclerView:

    <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="OK"
            android:background="@drawable/button"
            android:textColor="@color/white"
            android:id="@+id/bOK"
            android:layout_marginRight="33dp"
            android:layout_marginEnd="33dp"
            android:layout_marginBottom="0dp"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true" />

</android.support.v7.widget.RecyclerView>
Micha F.
  • 634
  • 4
  • 17
0

You should make the amendments in your code as per answers by @Micha and @Daniel

BUT

The logs depict a completely different problem -

You have set an attribute android:screenOrientation="landscape" for the parent RelativeLayout in your activity_warrior_self_battle_recyclerview.xml

And that is incorrect since android:screenOrientation is not a valid android attribute for RelativeLayout.

Shadab Ansari
  • 7,022
  • 2
  • 27
  • 45