1

我有一个主类和一个单独的类(OnClickBtn.java),我想在其中保留按钮方法。我想不是从主类而是从 OnClickBtn.java 开始新的活动。

我已经运行了该程序,但它在启动时崩溃了。我想我的主要问题与 Intent 对象“Intent int_btnOpenA =new Intent(objContex, ActivityA.class)”的代码有关

这是我的代码 MainActivity.java:

 package com.example.and2dtest;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
//START***VIEW LIST E BOTTONI
    TextView txtView01;
    Button btnOpenA;
    Button btnOpenB;
    EditText editText1;

    OnClickBtn btnMethods=new OnClickBtn(this);
//END***VIEW LIST E BOTTONI

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//Start***set buttons views
        txtView01=(TextView)findViewById(R.id.txtView01);
        btnOpenA=(Button)findViewById(R.id.btnOpenA);
        btnOpenB=(Button)findViewById(R.id.btnOpenB);
        editText1=(EditText)findViewById(R.id.editText1);   

        btnOpenA.setOnClickListener(btnMethods);
        btnOpenB.setOnClickListener(btnMethods);
//end***set buttons views
    }




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



}

这是 OnClickBtn.java 类:

package com.example.and2dtest;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;

public class OnClickBtn extends Activity implements OnClickListener {
MainActivity objContex;

    public OnClickBtn(MainActivity cont){
    objContex=cont;
    }

    Intent int_btnOpenA =new Intent(objContex, ActivityA.class); //<<THIS CAUSES CRASH!

    @Override
    public void onClick(View v) {
        switch(v.getId()){
        case R.id.btnOpenA:
            Log.d("ZR", "in case btnOpenA");
            //this.startActivity(int_btnOpenA);  //<-clearly This Wont Start
            break;
        case R.id.btnOpenB:
            Log.d("ZR","in case btnOpenB");
            //do something
            break;

        }   
    }


}

我怎样才能让它工作,保持 startActivity 方法不在主要活动中?

谢谢,路德

好的,我一直在弄乱代码,以下似乎有效,ActivityA 不是从 MainActivity.java 而是从 OnClickBtn.java 开始的,正如我试图做的那样。这是代码:

MainActivity.java:

package com.example.and2dtest;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {
//START***VIEW LIST E BOTTONI
    TextView txtView01;
    Button btnOpenA;
    Button btnOpenB;
    EditText editText1;


//END***VIEW LIST E BOTTONI

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

        OnClickBtn btnMethods=new OnClickBtn(this);
//Start***set buttons views
        txtView01=(TextView)findViewById(R.id.txtView01);
        btnOpenA=(Button)findViewById(R.id.btnOpenA);
        btnOpenB=(Button)findViewById(R.id.btnOpenB);
        editText1=(EditText)findViewById(R.id.editText1);   

        btnOpenA.setOnClickListener(btnMethods);
        btnOpenB.setOnClickListener(btnMethods);
//end***set buttons views
    }




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



}

OnClickBtn.java:

package com.example.and2dtest;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;

public class OnClickBtn implements OnClickListener {
Context objContext;

    public OnClickBtn(Context con){
    //v=view;
    objContext=con;
    }

    //Intent int_btnOpenA =new Intent(objContext, ActivityA.class);

    @Override
    public void onClick(View v) {
        switch(v.getId()){
        case R.id.btnOpenA:
            Log.d("ZR", "in case btnOpenA");
            Intent int_btnOpenA =new Intent(objContext, ActivityA.class);
            objContext.startActivity(int_btnOpenA);
            break;
        case R.id.btnOpenB:
            Log.d("ZR","in case btnOpenB");
            //do something
            break;

        }   
    }


}

活动A.java:

package com.example.and2dtest;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class ActivityA extends Activity {

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

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

}
4

6 回答 6

1

正如其他人所说,以这种方式实例化 an 是不好的,Activity并且不起作用。他们没有用户定义的构造函数。它们只能用Intent.

你可以做的是implements OnClickListener在你的点击类。在那里你override把你的代码放在那里。

这是一个证明这一点的答案

如果您希望它们可重用并且在每个中具有相同的功能,Activity那么您可以将它们放在BaseActivity您将extend在另一个中的一个中Activities

在这个 SO 答案中对此进行了更多解释

于 2013-09-23T20:17:36.283 回答
0

你不能自己实例化一个活动。虽然 OnClickBtn 扩展了一个 Activity,但它并没有作为一个 Activity 运行。

于 2013-09-23T19:56:10.263 回答
0

给 MainActiviy 一个以 Context 作为参数的构造函数。保存该上下文(或将其用于 getActivityContext() 以在您收到按钮单击时使用。

这是Android中的常用技术。您将看到许多将 Context 作为其构造函数的参数的对象。

此外,正如 Alécio 在他的回答中所说,MainActivity 不应扩展 Activity。任何将其用作活动的尝试都可能失败。

于 2013-09-23T19:57:13.407 回答
0

尝试这个:

Intent int_btnOpenA;
public OnClickBtn(MainActivity cont){
 int_btnOpenA=new Intent(cont, ActivityA.class);
}
于 2013-09-23T20:26:24.010 回答
0

试试这样:

(只需更改“btnOpenA.setOnClickListener(btnMethods);”和“btnOpenB.setOnClickListener(btnMethods);”这两个并忘记按钮类)


    btnOpenA.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(final View view) {
            final Intent intent = new Intent(MainActivity.this, ActivityA.class);
            SensorActivity.this.startActivity(intent);
        }
    });


    btnOpenB.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(final View view) {
            final Intent intent = new Intent(MainActivity.this, ActivityB.class);
            SensorActivity.this.startActivity(intent);
        }
    });

编辑:如果你非常想要那个按钮类,你可以试试这个:

(在你的活动中使用这个“监听器类”嵌套类注册监听器,或者将其更改为公共并将其放在不同的文件中,然后使用这个“监听器类”注册监听器。上下文仍然与 MainActivity 相关。)

private final class OnClickBtn implements OnClickListener {
    @Override
    public void onClick(final View view) {

        if( view.getId() == R.id.btnOpenA ){

            final Context context = view.getContext();
            final Intent intent = new Intent(context, ActivityA.class);
            view.getContext().startActivity(intent);
        }
        else if( view.getId() == R.id.btnOpenB ){

            final Context context = view.getContext();
            final Intent intent = new Intent(context, ActivityB.class);
            view.getContext().startActivity(intent);
        }
    }
}
于 2013-09-23T21:49:28.530 回答
0

尝试在 onCreate() 方法中设置 btnMethods,而不是在类级别。

.....

OnClickBtn btnMethods;

.....

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    btnMethods = new OnClickBtn(this);
    ......
}
于 2013-09-23T19:51:54.140 回答