我有一个主类和一个separete类(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;
}
}
}
ActivityA.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;
}
}
答案 0 :(得分:1)
正如其他人所说,以这种方式实例化Activity
并不起作用是不好的。它们没有用户定义的构造函数。它们只应使用Intent
实例化。
您可以在点击课中执行implements OnClickListener
。在那里你override
并将你的代码放在那里。
Here is an answer that demonstrates that
如果您希望它们可以重复使用并且在每个Activity
中具有相同的功能,那么您可以将它们放在BaseActivity
中,extend
将Activities
放在另一个{{1}}中
这再解释一下in this SO answer
答案 1 :(得分:0)
尝试在onCreate()方法中设置btnMethods,而不是在类级别设置。
.....
OnClickBtn btnMethods;
.....
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
btnMethods = new OnClickBtn(this);
......
}
答案 2 :(得分:0)
您无法自己实例化活动。虽然OnClickBtn正在扩展一个Activity,但它不能作为Activity运行。
答案 3 :(得分:0)
为MainActiviy提供一个以Context作为参数的构造函数。保存该Context(或者在收到按钮单击时使用它来使用getActivityContext()。
这是Android中的常用技术。您将看到许多对象将Context作为其构造函数的参数。
另外,正如Alécio在他的回答中所说,MainActivity不应该扩展Activity。任何将其用作活动的尝试都可能失败。
答案 4 :(得分:0)
试试这个:
Intent int_btnOpenA;
public OnClickBtn(MainActivity cont){
int_btnOpenA=new Intent(cont, ActivityA.class);
}
答案 5 :(得分: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);
}
});
编辑:如果你想要那个按钮类很糟糕,你可以试试这个:
(在您的活动中使用此“侦听器类”嵌套类注册侦听器,或将其更改为public并将其放在不同的文件上,然后使用此“侦听器类”注册侦听器。上下文仍将与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);
}
}
}