StartActivity从不同的上下文 [英] StartActivity from different context
问题描述
我有一个主类和separete类(OnClickBtn.java)中,我想保持在按钮methos。 我想开始新的活动,不是从主类,但是从OnClickBtn.java。
我已经运行的程序,但它崩溃的发射。我想我的主要问题是关系到code在意向对象意图int_btnOpenA =新的意图(objContex,ActivityA.class)
这是我的code,MainActivity.java:
包com.example.and2dtest;
进口android.app.Activity;
进口android.os.Bundle;
进口android.util.Log;
进口android.view.Menu;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.widget.Button;
进口android.widget.EditText;
进口android.widget.TextView;
进口android.widget.Toast;
公共类MainActivity延伸活动{
//开始***查看名单E BOTTONI
TextView的txtView01;
按钮btnOpenA;
按钮btnOpenB;
的EditText editText1;
OnClickBtn btnMethods =新OnClickBtn(本);
// END ***查看名单E BOTTONI
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
//开始***设置按键意见
txtView01 =(TextView中)findViewById(R.id.txtView01);
btnOpenA =(按钮)findViewById(R.id.btnOpenA);
btnOpenB =(按钮)findViewById(R.id.btnOpenB);
editText1 =(EditText上)findViewById(R.id.editText1);
btnOpenA.setOnClickListener(btnMethods);
btnOpenB.setOnClickListener(btnMethods);
//结束***设置按键意见
}
@覆盖
公共布尔onCreateOptionsMenu(功能菜单){
//充气菜单;这增加了项目操作栏,如果它是present。
。getMenuInflater()膨胀(R.menu.main,菜单);
返回true;
}
}
这是OnClickBtn.java类:
包com.example.and2dtest;
进口android.app.Activity;
进口android.content.Context;
进口android.content.Intent;
进口android.util.Log;
进口android.view.View;
进口android.view.View.OnClickListener;
公共类OnClickBtn扩展活动实现OnClickListener {
MainActivity objContex;
公共OnClickBtn(MainActivity续){
objContex = CONT;
}
意图int_btnOpenA =新的意图(objContex,ActivityA.class); //<<这会导致崩溃!
@覆盖
公共无效的onClick(视图v){
开关(v.getId()){
案例R.id.btnOpenA:
Log.d(万一btnOpenA,ZR,);
//this.startActivity(int_btnOpenA); //< -clearly这不会启动
打破;
案例R.id.btnOpenB:
Log.d(万一btnOpenB,ZR,);
//做一点事
打破;
}
}
}
我
如何才能使它发挥作用,保持startActivity方法不是在主要活动?
谢谢,路德
好吧,我一直在玩弄的code和下面似乎工作,ActivityA得到启动不是来自MainActivity.java而是从OnClickBtn.java,因为我要怎样做。 这是code:
MainActivity.java:
包com.example.and2dtest;
进口android.app.Activity;
进口android.os.Bundle;
进口android.util.Log;
进口android.view.Menu;
进口android.view.View;
进口android.view.View.OnClickListener;
进口android.widget.Button;
进口android.widget.EditText;
进口android.widget.TextView;
进口android.widget.Toast;
公共类MainActivity延伸活动{
//开始***查看名单E BOTTONI
TextView的txtView01;
按钮btnOpenA;
按钮btnOpenB;
的EditText editText1;
// END ***查看名单E BOTTONI
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
OnClickBtn btnMethods =新OnClickBtn(本);
//开始***设置按键意见
txtView01 =(TextView中)findViewById(R.id.txtView01);
btnOpenA =(按钮)findViewById(R.id.btnOpenA);
btnOpenB =(按钮)findViewById(R.id.btnOpenB);
editText1 =(EditText上)findViewById(R.id.editText1);
btnOpenA.setOnClickListener(btnMethods);
btnOpenB.setOnClickListener(btnMethods);
//结束***设置按键意见
}
@覆盖
公共布尔onCreateOptionsMenu(功能菜单){
//充气菜单;这增加了项目操作栏,如果它是present。
。getMenuInflater()膨胀(R.menu.main,菜单);
返回true;
}
}
OnClickBtn.java:
包com.example.and2dtest;
进口android.app.Activity;
进口android.content.Context;
进口android.content.Intent;
进口android.util.Log;
进口android.view.View;
进口android.view.View.OnClickListener;
公共类OnClickBtn实现OnClickListener {
语境objContext;
公共OnClickBtn(上下文CON){
// V =视图;
objContext = CON;
}
//意图int_btnOpenA =新的意图(objContext,ActivityA.class);
@覆盖
公共无效的onClick(视图v){
开关(v.getId()){
案例R.id.btnOpenA:
Log.d(万一btnOpenA,ZR,);
意图int_btnOpenA =新的意图(objContext,ActivityA.class);
objContext.startActivity(int_btnOpenA);
打破;
案例R.id.btnOpenB:
Log.d(万一btnOpenB,ZR,);
//做一点事
打破;
}
}
}
ActivityA.java:
包com.example.and2dtest;
进口android.os.Bundle;
进口android.app.Activity;
进口android.view.Menu;
公共类ActivityA延伸活动{
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_activity);
}
@覆盖
公共布尔onCreateOptionsMenu(功能菜单){
//充气菜单;这增加了项目操作栏,如果它是present。
。getMenuInflater()膨胀(R.menu.activity,菜单);
返回true;
}
}
正如其他人所说,这是不好的实例化一个活动
以这种方式,不会工作。它们不具有用户定义的构造。他们应该只被实例化与意图
。
你可以做的就是实现OnClickListener
在你的点击类。在那里,你覆盖
,把你的code在那里。
<一个href="http://stackoverflow.com/questions/12877826/android-can-we-extends-onclicklistener-another-class">Here是证明的答案。
如果你想他们是可重复使用的,并在每个活动相同的功能
,那么你可以将它们放在 BaseActivity
,你会延长
中的其他活动
。
这是解释多一点<一href="http://stackoverflow.com/questions/18963838/using-the-same-button-in-other-classes/18964134#18964134">in这太回答
I've got a main class and a separete class (OnClickBtn.java) in which I want to keep just the button methos. I would like to start new activities not from the main class but from the OnClickBtn.java.
I've run the program but it crashes at launch. I guess that my main issue is related to the code for the Intent object "Intent int_btnOpenA =new Intent(objContex, ActivityA.class)"
This is my code, 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;
}
}
this is the OnClickBtn.java class:
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;
}
}
}
how can I make it work, keeping the startActivity method not in the main activity?
Thanks, Luther
Ok I've been messing with the code and the following seems to work, ActivityA gets started not from MainActivity.java but from OnClickBtn.java, as I was trying to do. This is the code:
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;
}
}
As others have said, it is not good to instantiate an Activity
in this way and won't work. They don't have a user-defined constructor. They should only be instantiated with an Intent
.
What you can do is implements OnClickListener
in your click class. There you override
and put your code in there.
Here is an answer that demonstrates that.
If you want them to be reusable and have the same functionality in each Activity
then you can place them in a BaseActivity
which you will extend
in the other Activities
.
This is explained a little more in this SO answer
这篇关于StartActivity从不同的上下文的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!