【问题标题】:Accesing a MainActivity object from another class从另一个类访问 MainActivity 对象
【发布时间】:2013-08-19 11:23:34
【问题描述】:

我在编写一个 android 程序时遇到了困难。所以.. : 我在 MainActivity 中创建了一个 GoogleMap 对象 (theMap)。然后我启动了一个名为 GetDirections 的新 Activity,它启动了一个名为 RequestDirection(Non-Activity) 的新类。RequestDirection 类执行 Google Directions API 请求并解析 JSON 结果以创建一个PolylineOptions 对象。那么我如何访问 GoogleMap 对象(theMap)来添加折线??? 示例代码:

public class MainActivity extends Activity {
public GoogleMap theMap;
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
locationIcon=R.drawable.red_pin;

    theMap=((MapFragment)getFragmentManager().findFragmentById(R.id.map)).getMap();
        }}

public class GetDirections extends Activity{
//ask user to set Start/Destination Point

RequestDirection req= new RequestDirection();
req.execute();
finish();
}

public class RequestDirection extends AsyncTask {

doInBackground( ){
//returns the json string
}

onPostExecute( ){
PolylineOptions options= (the overview polyline points)
}

}

请注意,所有 3 个类都不是嵌套的。它们是单独的文件

我可以使用 mainActivity 上下文并将其传递给一个新类,但现在我启动一个新 Activity 并从那里开始创建该类。

我能做什么??我浪费了一整天,没有解决方案..


添加了 dst 建议的例外情况:

08-19 03:13:38.127: W/dalvikvm(1871): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
08-19 03:13:38.157: E/AndroidRuntime(1871): FATAL EXCEPTION: main
08-19 03:13:38.157: E/AndroidRuntime(1871): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1, result=0, data=null} to activity {com.ceid.CeidMaps/com.ceid.CeidMaps.MainActivity}: java.lang.NullPointerException
08-19 03:13:38.157: E/AndroidRuntime(1871):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3141)
08-19 03:13:38.157: E/AndroidRuntime(1871):     at android.app.ActivityThread.handleSendResult(ActivityThread.java:3184)
08-19 03:13:38.157: E/AndroidRuntime(1871):     at android.app.ActivityThread.access$1100(ActivityThread.java:130)
08-19 03:13:38.157: E/AndroidRuntime(1871):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243)
08-19 03:13:38.157: E/AndroidRuntime(1871):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-19 03:13:38.157: E/AndroidRuntime(1871):     at android.os.Looper.loop(Looper.java:137)
08-19 03:13:38.157: E/AndroidRuntime(1871):     at android.app.ActivityThread.main(ActivityThread.java:4745)
08-19 03:13:38.157: E/AndroidRuntime(1871):     at java.lang.reflect.Method.invokeNative(Native Method)
08-19 03:13:38.157: E/AndroidRuntime(1871):     at java.lang.reflect.Method.invoke(Method.java:511)
08-19 03:13:38.157: E/AndroidRuntime(1871):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
08-19 03:13:38.157: E/AndroidRuntime(1871):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-19 03:13:38.157: E/AndroidRuntime(1871):     at dalvik.system.NativeStart.main(Native Method)
08-19 03:13:38.157: E/AndroidRuntime(1871): Caused by: java.lang.NullPointerException
08-19 03:13:38.157: E/AndroidRuntime(1871):     at com.ceid.CeidMaps.MainActivity.onActivityResult(MainActivity.java:162)
08-19 03:13:38.157: E/AndroidRuntime(1871):     at android.app.Activity.dispatchActivityResult(Activity.java:5192)
08-19 03:13:38.157: E/AndroidRuntime(1871):     at android.app.ActivityThread.deliverResults(ActivityThread.java:3137)
08-19 03:13:38.157: E/AndroidRuntime(1871):     ... 11 more

【问题讨论】:

  • MainActivity.java:162 是哪一行?
  • PolylineOptions opt= data.getParcelableExtra("options");这是在 OnActivityresult 覆盖内
  • 在这种情况下,data 为空。验证结果代码是否与您在setResult 中设置的相同,并且您在此处设置的Intent data 参数不为空。
  • 我根本没有使用 setResult() 方法...我只是使用了方法 putExtra("options",(这里我插入了折线对象))
  • 您必须使用setResult 在您的onActivityResult 方法中接收Intent。在您当前的putExtra 的位置使用该方法:创建一个final Intent intent = new Intent(),将您的额外内容放入其中并调用setResult(RESULT_FIRST_USER, intent)

标签: java android google-maps


【解决方案1】:

您可能应该返回您的GetDirections 活动的折线as a result。然后,您可以从MainActivity 中添加折线。这样,您的 UI 仅从封闭的 Activity 更新,而不是从另一个 Activity 更新(这将违反 Android 的代码样式,尽管它可能是可能的)。

【讨论】:

  • 我也试过了,但我有一些 nullexception 错误..我认为这个问题是在后台运行的 asynctask..
  • @GreekBurner 请将例外添加到您的问题 (logcat)
  • 好吧:我尝试将 GetDirections 上下文作为参数传递给 req 创建。在 onPostExecute 中我调用了 ((GetDirections)context).getIntent().putExtra("options",optionspolyline);和主 Activity 上的 finish() 我用 getParcelableExtra("options"); 实现了 OnActivityResult;
【解决方案2】:

如果您知道您的 MainActivity 总是会排在第一位,那么允许访问 GoogleMap 对象的一种简单方法是创建 static。例如,用public static GoogleMap theMap 代替public GoogleMap theMap。然后,您可以从任何其他类调用MainActivity.theMap 来访问该对象。

如果情况变得更复杂,还有其他更好的方法可以做到,但如果只是获取对象那么简单,那么这种方法肯定行得通。

【讨论】:

  • 我知道这是我尝试的第一件事。但这对我没有帮助,因为 MainActivity 并不总是首先出现,所以我必须尝试另一种解决方案。无论如何谢谢! :)
  • 请不要在任何情况下使用此方法,因为即使MainActivity在以常规方式调用应用程序时先出现,它也有可能被操作系统破坏(或其他不良事情发生)。这不是 Android 的预期用途。
猜你喜欢
  • 2013-09-23
  • 2015-11-22
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 2011-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多