【问题标题】:Pass Context from Activity从 Activity 传递上下文
【发布时间】:2015-08-26 21:23:55
【问题描述】:

好的,直截了当,我是这个 android 编程的初学者,由于“无法解析方法 getapplicationcontext”,我对如何从我的活动中传递上下文有疑问

这是 MyLocationListener.java :

 public class MyLocationListener implements LocationListener {
        // Dipanggil saat ada perubahan lokasi geografis pengguna

private Context mContext;

    public MyLocationListener(Context context) {
        mContext = context;
    }

        @Override
        public void onLocationChanged(Location location) {
    // Mendapatkan nilai latitude dari lokasi terbaru
            double latitude = location.getLatitude();

    // Mendapatkan nilai longitude dari lokasi terbaru
            double longitude = location.getLongitude();

    // Menampilkan lokasi terbaru menggunakan Toast
            String message = "Lokasi saat ini :\n" +
                    "Latitude  = " + latitude + "\n" +
                    "Longitude = " + longitude;
            Toast.makeText(getApplicationContext(),
                    message, Toast.LENGTH_LONG).show();
        }

        // Dipanggil saat provider dinon-aktifkan oleh pengguna
        @Override
        public void onProviderDisabled(String provider) {
            String message = "GPS disabled";
            Toast.makeText(getApplicationContext(),
                    message, Toast.LENGTH_LONG).show();
        }

        // dipanggil saat provider diaktifkan oleh pengguna
        @Override
        public void onProviderEnabled(String provider) {
            String message = "GPS enabled";
            Toast.makeText(getApplicationContext(),
                    message, Toast.LENGTH_LONG).show();
        }

        // dipanggil saat ada perubahan status pada provider
        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
    // TODO Auto-generated method stub
        }
    }

这是我的活动(GPSSample.java):

public class GPSSample extends Activity {
        /** Called when the activity is first created. */
        @Override

LocationListener myLocationListener = new MyLocationListener(this);

        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

    // Inisiasi LocationManager dan LocationListener
            LocationManager myLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
            LocationListener myLocationListener = new MyLocationListener();
            myLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, myLocationListener);
        }

它说我应该使用构造函数来传递它,但是如何? 我有一些构造函数示例,但我不知道把它放在哪里,并根据我的脚本重命名它

MyClass myClass = new MyClass(this);

然后在该类中创建一个接受 Context 作为参数并使用它的构造函数

public class MyClass  
{ 
    Context c;
    public MyClass(Context context)
    { 
         c= context;
     } 
}} 

感谢您的帮助...

【问题讨论】:

  • 你可以使用 GPSSample.this
  • 它需要构造函数,很抱歉已经更新了问题。我已经将 Activity 和 Listener 分开了。谢谢回答

标签: android android-studio android-context


【解决方案1】:

1

您需要将上下文作为传入参数传递。

public class MyLocationListener implements LocationListener {

    // Dipanggil saat ada perubahan lokasi geografis pengguna
    private Context mContext;

    public MyLocationListener(Context context) {
        mContext = context;
    }

    @Override
    public void onLocationChanged(Location location) {
// Mendapatkan nilai latitude dari lokasi terbaru
        double latitude = location.getLatitude();

// Mendapatkan nilai longitude dari lokasi terbaru
        double longitude = location.getLongitude();

// Menampilkan lokasi terbaru menggunakan Toast
        String message = "Lokasi saat ini :\n" +
                "Latitude  = " + latitude + "\n" +
                "Longitude = " + longitude;
        // change getApplicationContext() to mContext(inner context reference)
        Toast.makeText(mContext,
                message, Toast.LENGTH_LONG).show();
    }

    // Dipanggil saat provider dinon-aktifkan oleh pengguna
    @Override
    public void onProviderDisabled(String provider) {
        String message = "GPS disabled";
        // change getApplicationContext() to mContext(inner context reference)
        Toast.makeText(mContext,
                message, Toast.LENGTH_LONG).show();
    }

    // dipanggil saat provider diaktifkan oleh pengguna
    @Override
    public void onProviderEnabled(String provider) {
        String message = "GPS enabled";
        // change getApplicationContext() to mContext(inner context reference)
        Toast.makeText(mContext,
                message, Toast.LENGTH_LONG).show();
    }

    // dipanggil saat ada perubahan status pada provider
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
    }
}

并在 Activity 中设置:

LocationListener myLocationListener = new MyLocationListener(this);

2

您还可以使用 .this 构造来使用自引用。 .this - 在 Java 中 - 是他自己的参考。 但是如果类是静态的 - 你会得到编译错误。

【讨论】:

  • 我遇到了新错误:错误:(28, 47) 错误:MyLocationListener 类中的构造函数 MyLocationListener 不能应用于给定类型;必需:找到上下文:无参数原因:实际参数列表和形式参数列表的长度不同错误:任务':app:compileDebugJavaWithJavac'的执行失败。 > 编译失败;有关详细信息,请参阅编译器错误输出。
  • @RikudoPain 你添加了构造函数?
  • 是的,我将其添加为您的建议,已更新问题(现在根据您的建议)
  • @RikudoPain 但您不会将 getApplicationContext() 替换为 mContext
  • @RikudoPain 我认为你是从 Web 开发跳到 Android 的。不要为了很好的理解而寻找 context 的平行。实际上,上下文是允许您获取资源或类似环境数据的实体。您不需要在任何地方传递上下文,但在这种情况下 - 您应该,因为如果您查看代码,您可以找到需要使用上下文的 Toast 类。有关上下文的更多信息:stackoverflow.com/a/18327529/2956344
【解决方案2】:

只需使用 GPSSample.this 代替 getApplicationContext()。这是“外部 this”,即父类的 this,在这种情况下,它是活动(活动是上下文的子类)。

如果您需要移动监听器(我不这么认为),请使用构造函数。通常,您甚至会为侦听器使用匿名类而不是具体的类。阅读起来更直接清晰。

【讨论】:

  • 其实是的,我会移动听者(用于学习目的)。我只是好奇如何将上下文传递给另一个活动,这就是我问这个问题的原因。我看到了很多关于使用构造函数的解释,但我在实现它时遇到了问题,因为我对这个编程真的很陌生。无论如何感谢您的回答。 (更新问题)
  • 是的,但通常您不会在侦听器中定义构造函数。这是矫枉过正。您只需将引用与另一个 this 通常或直接使用某种变量(或直接使用匿名类中的 getContext() )传递。显然你可以创建一个外部类,有时可能对听众有用,但大多数情况下它不是...... :)
  • 是的,这就是重点,因为我在问题之前的解释是关于传递上下文,它是为了学习目的,正如你所说,有时可能有用,在这种情况下,我真的很好奇它是如何工作的。跨度>
猜你喜欢
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-15
  • 1970-01-01
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多