Çağdaş
Çağdaş

Reputation: 3

Android - How to use methods from another class in setOnClickListener?

My code below crashes as soon as I start the app. I want to use my "greenBackground" and "whiteBackground" methods from Methods.class in TestActivity's setOnClickListener methods. Is there a proper way to call the methods from Methods class? Any help is appreciated.

TestActivity.class:

package com.mfg.test;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;


public class TestActivity extends ActionBarActivity {

    Methods method = new Methods();

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

        Button greenButton = (Button) findViewById(R.id.GreenButton);
        Button whiteButton = (Button) findViewById(R.id.WhiteButton);

        greenButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                method.greenBackground(v);
            }
        });

        whiteButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                method.whiteBackground(v);
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.test, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

Methods.class:

package com.mfg.test;

import android.graphics.Color;
import android.view.View;

public class Methods extends TestActivity {

    View rl = findViewById(R.id.rl);

    public void greenBackground(View rl)
    {
        rl.setBackgroundColor(Color.GREEN);
    }

    public void whiteBackground(View rl)
    {
        rl.setBackgroundColor(Color.WHITE);
    }
}

Here is the log file:

07-29 10:42:37.962: E/AndroidRuntime(2017): FATAL EXCEPTION: main
07-29 10:42:37.962: E/AndroidRuntime(2017): Process: com.mfg.test, PID: 2017
07-29 10:42:37.962: E/AndroidRuntime(2017): java.lang.StackOverflowError
07-29 10:42:37.962: E/AndroidRuntime(2017):     at java.lang.ref.FinalizerReference.<init>(FinalizerReference.java:42)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at java.lang.ref.FinalizerReference.add(FinalizerReference.java:54)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at android.os.StrictMode$InstanceTracker.<init>(StrictMode.java:2244)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at android.os.StrictMode.trackActivity(StrictMode.java:1946)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at android.app.Activity.<init>(Activity.java:761)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at android.support.v4.app.FragmentActivity.<init>(FragmentActivity.java:76)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at android.support.v7.app.ActionBarActivity.<init>(ActionBarActivity.java:55)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:11)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>(Methods.java:6)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.TestActivity.<init>(TestActivity.java:13)
07-29 10:42:37.962: E/AndroidRuntime(2017):     at com.mfg.test.Methods.<init>

It seems there is a problem with "Methods method = new Methods();" line in TestActivity class. How can I fix this problem?

Upvotes: 0

Views: 903

Answers (2)

Bernard
Bernard

Reputation: 71

I don't understand what are you trying to do, but that seems like a really bad arhitecture. StackOverflowException happened because your program became infinitely recursive with those two classes. Do you really need Methods Activity?

greenButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View greenButton) {
            greenButton.setBackgroundColor(Color.GREEN);
        }
    });

View parameter in that listener is greenButton itself so you can use it and set the background color.

Explanation

You dont need Activity for that, you can make normal class like:

public class Methods{

public void greenBackground(View rl) {
    rl.setBackgroundColor(Color.GREEN);
}

public void whiteBackground(View rl) {
    rl.setBackgroundColor(Color.WHITE);
}

}

Make an instance in your activity and use it like that without unnecessary references.

Upvotes: 0

Shailendra Madda
Shailendra Madda

Reputation: 21551

Get Id's in onCreate method after setContentView(R.layout.program); like:

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

    Button greenButton = (Button) findViewById(R.id.GreenButton);
    Button whiteButton = (Button) findViewById(R.id.WhiteButton);

    more code goes here..

And don't forget to mention your Methods activity in Android manifest file:

Like <activity android:name=".Methods" />

Upvotes: 3

Related Questions