来自不同上下文的StartActivity

时间:2013-09-23 19:47:32

标签: android android-intent android-activity android-context

我有一个主类和一个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;
    }

}

6 个答案:

答案 0 :(得分:1)

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

您可以在点击课中执行implements OnClickListener。在那里你override并将你的代码放在那里。

Here is an answer that demonstrates that

如果您希望它们可以重复使用并且在每个Activity中具有相同的功能,那么您可以将它们放在BaseActivity中,extendActivities放在另一个{{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);
        }
    }
}