【问题标题】:Android - How to use methods from another class in setOnClickListener?Android - 如何在 setOnClickListener 中使用另一个类的方法?
【发布时间】:2014-07-29 04:51:35
【问题描述】:

我下面的代码在我启动应用程序后立即崩溃。我想在 TestActivity 的 setOnClickListener 方法中使用 Methods.class 中的“greenBackground”和“whiteBackground”方法。有没有从方法类调用方法的正确方法?任何帮助表示赞赏。

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);
    }
}

这是日志文件:

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>

“Methods method = new Methods();”似乎有问题TestActivity 类中的行。我该如何解决这个问题?

【问题讨论】:

  • 发布您遇到的错误?并发布日志猫..
  • 我认为您必须使用 Fragment Activity 来满足您的要求。
  • @MFG 您希望在 class2 中访问 c​​lass 1 的哪些方法?
  • 你好。我将 Buttons 移入 onCreate 并再次运行该应用程序以获取其日志。

标签: android class button methods listener


【解决方案1】:

setContentView(R.layout.program);之后的onCreate方法中获取Id就像:

@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..

别忘了在 Android 清单文件中提及您的方法活动

点赞&lt;activity android:name=".Methods" /&gt;

【讨论】:

    【解决方案2】:

    我不明白你想做什么,但这似乎是一个非常糟糕的架构。发生 StackOverflowException 是因为您的程序使用这两个类变得无限递归。你真的需要方法活动吗?

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

    该侦听器中的 View 参数是 greenButton 本身,因此您可以使用它并设置背景颜色。

    说明

    你不需要 Activity ,你可以制作普通的类:

    public class Methods{
    
    public void greenBackground(View rl) {
        rl.setBackgroundColor(Color.GREEN);
    }
    
    public void whiteBackground(View rl) {
        rl.setBackgroundColor(Color.WHITE);
    }
    

    }

    在您的活动中创建一个实例并像这样使用它,而无需不必要的引用。

    【讨论】:

    • 我想将方法​​与主要活动分开,并在需要时调用它们。但进展并没有像我预期的那样完成。
    • 我给你加了解释。
    • 谢谢。我将我的“View rl”定义作为“final View rl”移动到主类并使用了你的解释。
    猜你喜欢
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2019-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-27
    相关资源
    最近更新 更多