Home » Android » java – Button Click Causes App To Crash

java – Button Click Causes App To Crash

Posted by: admin June 15, 2020 Leave a comment

Questions:

I have just set an onClick method which is written in the activity class to be called whenever the button is clicked. Even before it enters the method, the app crashes.

Error message that I am getting when the floating action button is clicked;

java.lang.IllegalArgumentException: Expected receiver of type com.example.bob.vexteamqueuing.AdminControl,
but got android.support.v7.view.ContextThemeWrapper java.lang.IllegalArgumentException:
Expected receiver of type com.example.bob.vexteamqueuing.AdminControl, but got android.support.v7.view.ContextThemeWrapper

at java.lang.reflect.Method.invoke(Native Method)
at android.view.View$DeclaredOnClickListener.onClick(View.java:4447)
at android.view.View.performClick(View.java:5198)
at android.view.View$PerformClick.run(View.java:21147)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)   
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

XML Code for the activity:

<?xml version="1.0" encoding="utf-8"?>

<android.support.design.widget.AppBarLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/NoActionBar">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/AppTheme.PopupOverlay"
        />

</android.support.design.widget.AppBarLayout>

<include layout="@layout/content_admin_control" />

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    android:layout_margin="@dimen/fab_margin"
    android:src="@android:drawable/ic_input_add"
    android:onClick="createNewTournament"
    android:clickable="true" />

AdminControl activity Java code:

  public class AdminControl extends AppCompatActivity {

        Firebase ref;
        public static List <Tournament> tournaments;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_admin_control);
            Toolbar b = (Toolbar) findViewById(R.id.toolbar);
            b.setTitle("Tournaments");
            setSupportActionBar(b);
            ref = AdminLogin.firebase.child("users").child(AdminLogin.firebase.getAuth().getUid());
            if (tournaments == null){
                tournaments = new ArrayList<>();
            }        
        }

        public void createNewTournament(View v) {
            Intent newIntent = new Intent(this, TournamentCreator.class);
            startActivity(newIntent);
        }  
  }

On Create – Tournament Creator

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tournament_creator);
    /*b = (FloatingActionButton) findViewById(R.id.fab);
    b.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            beginTournament(v);
        }
    });*/
}

Manifest file – may not be necessary but just provided

<?xml version="1.0" encoding="utf-8"?>

<uses-permission android:name="android.permission.INTERNET" />

<!-- To auto-complete the email text field in the login form with the user's emails -->
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />

<application
    android:name=".VEXQueuing"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".Initial">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name=".AdminLogin"
        android:label="@string/title_activity_admin_login"
        android:parentActivityName=".Initial">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.bob.vexteamqueuing.Initial" />
    </activity>
    <activity android:name=".TournamentCreator" />
    <activity
        android:name=".AdminControl"
        android:label="@string/title_activity_admin_control"
        android:parentActivityName=".Initial"
        android:theme="@style/NoActionBar">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.bob.vexteamqueuing.Initial" />
    </activity>
</application>

How to&Answers:

Your problem should be solved removing your android:onClick="createNewTournament" event from your layout

<android.support.design.widget.FloatingActionButton
    android:id="@+id/fab"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom|end"
    android:layout_margin="@dimen/fab_margin"
    android:src="@android:drawable/ic_input_add"   
    android:clickable="true" />

And adding a listener to R.id.fab in your onCreate, like this.

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_admin_control);
    Toolbar b = (Toolbar) findViewById(R.id.toolbar);
    b.setTitle("Tournaments");
    setSupportActionBar(b);
    ref = AdminLogin.firebase.child("users").child(AdminLogin.firebase.getAuth().getUid());
    if (tournaments == null){
        tournaments = new ArrayList<>();
    }

    FloatingActionButton myFab = (FloatingActionButton)findViewById(R.id.fab); 
    myFab.setOnClickListener(new View.OnClickListener() { 
        public void onClick(View v) { 
            createNewTournament(v); 
        } 
    });
}

The same problem happen in this question EditText OnClick Exception and was fixed using listener.

Hope this helps!!

Answer:

The previous solutions (by @GueorguiObregon and @MuhammadFaisalHyder) work but were not the thing that I was wishing. I found out the problem came from setting the android:theme attribute to the view (in my case), and also is related to the AppCompat library (see this).

So I simply removed the android: namespace from this line (from the view’s style):

<item name="android:theme">@style/someTheme</item>

and made it likes:

<item name="theme">@style/someTheme</item>

and it works fine.

The amazing thing is the problem is only on the high-level APIs (23 I tested) and on low-level APIs (16 and 19 I tested) both ways (with or without android: namespace) work.

Also, see @MateiSuica comment below if you want to insert theme directly to the element (without using a style).

Answer:

why not doing it the typical way? Try normally like by Declaring

public class AdminControl extends AppCompatActivity {
    //....
    FloatingActionButton mFAB;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_admin_control);

        Toolbar b = (Toolbar) findViewById(R.id.toolbar);
        //....
        mFAB = (FloatingActionButton) findViewById(R.id.fab);
        mFAB.setOnClickListener(new View.OnClickListener(){      

            @Override
            public void onClick(View view) {
                 Intent newIntent = new Intent(this, TournamentCreator.class);
                 startActivity(newIntent);
            }                
        });
    }

And use XML for floating button like this:

<android.support.design.widget.FloatingActionButton
 android:id="@+id/fab"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_gravity="bottom|end"
 android:layout_margin="@dimen/fab_margin"
 android:src="@android:drawable/ic_input_add"     
/>

This is the common way and clean way to do it, hope i helped.