StartActivity从不同的上下文 [英] StartActivity from different context

查看:170
本文介绍了StartActivity从不同的上下文的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个主类和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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆