如何在 Android 中正确退出 Processing sketch
How to correctly exit a Processing sketch in Android
我目前正在 Android Studio 中构建一个涉及处理草图的应用程序。
主要class:
import android.app.Activity;
import android.app.FragmentManager;
import android.os.Bundle;
import processing.android.PFragment;
import processing.core.PApplet;
public class ClassMain extends Activity {
/**************************************************/
PApplet sketch;
/**************************************************/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.class_main);
FragmentManager fragmentManager = getFragmentManager();
sketch = new ClassSketch();
PFragment fragment = new PFragment();
fragment.setSketch(sketch);
fragmentManager.beginTransaction().replace(R.id.container, fragment).commit();
}
/**************************************************/
@Override
public void onBackPressed()
{
//ClassMain.this.finish();
}
/**************************************************/
//It doesn't work if called from sketch...
public void exits()
{
ClassMain.this.finish();
}
/**************************************************/
}
加工草图:
import android.view.KeyEvent;
import processing.core.PApplet;
public class ClassSketch extends PApplet {
/*****************************************************************************/
public void settings()
{
size(displayWidth, displayHeight);
}
/*****************************************************************************/
public void setup()
{
}
/*****************************************************************************/
public void draw()
{
keykey();
}
public void keykey()
{
if(keyPressed)
{
if (key == CODED) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
//non of the following work:
//exit();
ClassMain j = new ClassMain();
j.exits();
}
}
}
}
}
这是问题所在,我希望用户根据我稍后将在草图中添加的某些情况,不仅退出草图,还退出托管它的 class(ClassMain
).
每当(在草图中)我的草图中发生某些事情时,我希望能够退出整个 MainClass
,但我恰好失败了。
感谢支持
这没有意义:
ClassMain j = new ClassMain();
j.exits();
此处您正在创建 ClassMain
的新实例,然后立即退出。那不会做任何事情。
相反,您需要告诉已经存在的父级 ClassMain
退出。
为此,您需要引用父 ClassMain
实例,您可以将其带入 ClassSketch
构造函数:
public class ClassSketch extends PApplet {
private ClassMain parent;
public ClassSketch(ClassMain parent){
this.parent = parent;
}
public void keykey(){
parent.exits();
}
}
然后将实例传递给构造函数,您可以简单地使用this
关键字:
protected void onCreate(Bundle savedInstanceState) {
sketch = new ClassSketch(this);
}
作为对上述内容的补充说明,不要忘记在 onCreate()
函数中调用 super.onCreate(savedInstanceState);
。
您可以通过访问 finish()
直接退出草图:this.getActivity().finish();
。请注意,在 API 级别 16 及以上,您还可以使用 this.getActivity().finishAffinity();
,如 here 中所述。
最后,如果您按下 home 按钮,它会调用 onStop()
,因此应用程序会留在内存中。如果您按下 back 按钮,那么 onDestroy()
也会被调用。如果您按说明调用 finish()
,则肯定会调用 onDestroy()
。
我的两分钱...
Kf
我目前正在 Android Studio 中构建一个涉及处理草图的应用程序。
主要class:
import android.app.Activity;
import android.app.FragmentManager;
import android.os.Bundle;
import processing.android.PFragment;
import processing.core.PApplet;
public class ClassMain extends Activity {
/**************************************************/
PApplet sketch;
/**************************************************/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.class_main);
FragmentManager fragmentManager = getFragmentManager();
sketch = new ClassSketch();
PFragment fragment = new PFragment();
fragment.setSketch(sketch);
fragmentManager.beginTransaction().replace(R.id.container, fragment).commit();
}
/**************************************************/
@Override
public void onBackPressed()
{
//ClassMain.this.finish();
}
/**************************************************/
//It doesn't work if called from sketch...
public void exits()
{
ClassMain.this.finish();
}
/**************************************************/
}
加工草图:
import android.view.KeyEvent;
import processing.core.PApplet;
public class ClassSketch extends PApplet {
/*****************************************************************************/
public void settings()
{
size(displayWidth, displayHeight);
}
/*****************************************************************************/
public void setup()
{
}
/*****************************************************************************/
public void draw()
{
keykey();
}
public void keykey()
{
if(keyPressed)
{
if (key == CODED) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
//non of the following work:
//exit();
ClassMain j = new ClassMain();
j.exits();
}
}
}
}
}
这是问题所在,我希望用户根据我稍后将在草图中添加的某些情况,不仅退出草图,还退出托管它的 class(ClassMain
).
每当(在草图中)我的草图中发生某些事情时,我希望能够退出整个 MainClass
,但我恰好失败了。
感谢支持
这没有意义:
ClassMain j = new ClassMain();
j.exits();
此处您正在创建 ClassMain
的新实例,然后立即退出。那不会做任何事情。
相反,您需要告诉已经存在的父级 ClassMain
退出。
为此,您需要引用父 ClassMain
实例,您可以将其带入 ClassSketch
构造函数:
public class ClassSketch extends PApplet {
private ClassMain parent;
public ClassSketch(ClassMain parent){
this.parent = parent;
}
public void keykey(){
parent.exits();
}
}
然后将实例传递给构造函数,您可以简单地使用this
关键字:
protected void onCreate(Bundle savedInstanceState) {
sketch = new ClassSketch(this);
}
作为对上述内容的补充说明,不要忘记在 onCreate()
函数中调用 super.onCreate(savedInstanceState);
。
您可以通过访问 finish()
直接退出草图:this.getActivity().finish();
。请注意,在 API 级别 16 及以上,您还可以使用 this.getActivity().finishAffinity();
,如 here 中所述。
最后,如果您按下 home 按钮,它会调用 onStop()
,因此应用程序会留在内存中。如果您按下 back 按钮,那么 onDestroy()
也会被调用。如果您按说明调用 finish()
,则肯定会调用 onDestroy()
。
我的两分钱...
Kf