【问题标题】:Passing data from a surfaceView to another activity将数据从表面视图传递到另一个活动
【发布时间】:2013-07-11 14:25:14
【问题描述】:

下面代码的解释:我要完成的任务是从我的surfaceview活动(surfaceActivity)向我的主要活动(mainActivity)发送一个布尔值。下面是我的代码的 4 部分,mainActivity 的初始化,surfaceActivity 的初始化,我如何发送布尔值,以及我如何接收布尔值。显然,我用来发送/接收信息的代码是大多数人在互联网上取得成功的代码,只是考虑到我有两个活动,我的情况有点不同,但 surfaceActivity 是通过 mainActivity 设置的,因此不是真的独立。

我的主要活动:

public class MainActivity extends Activity {

      public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(new surfaceActivity(this));

           private Bundle bundle;
      }
 }

然后导致我的surfaceView

public class surfaceActivity extends SurfaceView  implements SurfaceHolder.Callback {
     private MainThread thread;
     private Context context;

     public surfaceActivity(Context context) {
     super(context);
     getHolder().addCallback(this);
     thread = new MainThread(getHolder(), this);

     this.context = context;

     setFocusable(true);
     }

那么当屏幕上的触摸被注册时:

Intent i = new Intent(context, MainActivity.class);             
Bundle bundle = new Bundle();
bundle.putBoolean("boo",true);
i.putExtras(bundle);
startActionMode((Callback) i);

然后在 MainActivity 类上不断重复循环:

if (bundle != null)
{
    bundle = getIntent().getExtras();
    Boolean stuff = bundle.getBoolean("boo"); 
}

另外,大多数人一直在使用 startActivity(i);但 eclipse 将其更正为 startActionMode((Callback) i);

提前非常感谢!

【问题讨论】:

    标签: java android android-activity bundle surfaceview


    【解决方案1】:

    MainActivity 是一个 Activity,而 SurfaceActivity(尽管名称是 Activity)只是一个已添加为 MainActivity 内容视图的视图。 MainActivity 可以将 SurfaceActivity 的引用声明为 Instance 变量,然后它可以从 SurfaceActivity 中读取值。

    基于意图的机制通常用于在活动之间传递值,在您的情况下,您没有 2 个活动。你有一个 Activity 和一个 View。

    【讨论】:

    • 如何将信息从我的视图发送到其父活动?
    • 有多种方法可以实现相同的目标。您可以将 SurfaceActivity 创建为 MainActivity 的内部类。内部类将有权访问外部类的所有实例变量和方法。因此SurfaceActivity可以直接在MainActivity中设置变量。
    • 您正在将 MainActivity 的引用传递给构造函数中的 SurfaceActivity。您可以将 Context 变量强制转换为 MainActivity 并使用 MainActivity 中的 mutator 方法设置值。
    • 然而,最灵活的方法是使用 Java 中的 Listener 机制。
    • 您能否进一步解释您的第二条评论?
    【解决方案2】:

    为了从SurfaceView(在OP 示例中为SurfaceActivity)调用MainActivity 中的方法,您可以这样做:

    MainActivity 设置:

    public class MainActivity extends Activity {
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(new surfaceActivity(this));
            private Bundle bundle;
        }
    
        // Method to be called from the SurfaceView
        public void callMe(String valuePassed) {
            Log.d("DEBUG","MainActivity was passed ["+ valuePassed +"]");
        }
    }
    

    SurfaceView 设置:

    public class SurfaceActivity extends SurfaceView 
                                 implements SurfaceHolder.Callback {
    
        private MainThread thread;
        private Context context;
    
        public SurfaceActivity(Context context) {
            super(context);
            getHolder().addCallback(this);
            thread = new MainThread(getHolder(), this);
    
            this.context = context;
    
            setFocusable(true);
        }
    
        // This is where and how you make the call to MainActivity.
        // You cast the context as the MainActivity and call the method.
        private void passToMainActivity(String valToPass) {
            ((MainActivity) context).callMe(valToPass);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-14
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      相关资源
      最近更新 更多