Hello stackoverflow的世界,
这是我在这里的第一篇文章。
我是Android界的新手,所以如果我在网上查看不同的教程,我在打开自己的地图时必须出现的启用GPS设置有问题。
我尝试过以下代码:Android get location or prompt to enable location service if disabled
Button gpsButton = (Button)this.findViewById(R.id.buttonGPSLocation);
gpsButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Start loction service
LocationManager locationManager = (LocationManager)[OUTERCLASS].this.getSystemService(Context.LOCATION_SERVICE);
Criteria locationCritera = new Criteria();
locationCritera.setAccuracy(Criteria.ACCURACY_COARSE);
locationCritera.setAltitudeRequired(false);
locationCritera.setBearingRequired(false);
locationCritera.setCostAllowed(true);
locationCritera.setPowerRequirement(Criteria.NO_REQUIREMENT);
String providerName = locationManager.getBestProvider(locationCritera, true);
if (providerName != null && locationManager.isProviderEnabled(providerName)) {
// Provider is enabled
locationManager.requestLocationUpdates(providerName, 20000, 100, [OUTERCLASS].this.locationListener);
} else {
// Provider not enabled, prompt user to enable it
Toast.makeText([OUTERCLASS].this, R.string.please_turn_on_gps, Toast.LENGTH_LONG).show();
Intent myIntent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
[OUTERCLASS].this.startActivity(myIntent);
}
}
});
但我收到了一些错误,也许是因为我也无法理解它!
这是我的问题:
因此,一般来说,有人可以更好地向我解释如何使用此代码以及我需要做什么修改。
如果您需要,我可以发送我的整个Java代码。
提前感谢您的可用性。
关于,
克劳迪奥
答案 0 :(得分:1)
嗯,你这里有几个问题。
为什么需要声明一个Button(gpsButton)以及我在哪里/如何创建它?
如果要创建按钮,则可以在Activity使用的XML布局中声明它,也可以在代码中添加它。如果您只是粘贴某些示例中的代码,您将需要了解此代码实际上是通过它的id在当前视图中找到它而形成对该对象的引用(即当前正在显示的布局)。因此,如果您还没有在XML中的某处创建一个id为buttonGPSLocation的按钮,那么此代码将无效。至于为什么有必要:似乎样本的作者决定提示用户点击按钮以打开手机设置并启用GPS。
代码可以在MapActivity类之后整体推出,还是必须在第一次onCreate之后推出?
这个问题不是很清楚(可能是这里的语言问题),但如果您发布所有相关代码,它可能会有所帮助。通常,设置onClickListeners可能应该在您的Activity的onCreate中完成。是否在MapActivity内部完成取决于您未提供给我们的更多信息。
什么是OUTERCLASS?
在Java中,您可以在另一个类中定义一个类。我们通常将类定义为“顶级”类,即一些文件名SomeClass.java,其内容看起来像
public class SomeClass {
//some code
}
现在,当您在另一个类中定义一个类时,“嵌套”类是另一个类的内部,反之亦然。所以包含嵌套类的那个是“外部”类。
class OuterClass {
...
class NestedClass {
...
}
}
为什么这一切都很重要?好吧,因为有一些关于外部类和嵌套类之间的工作方式的规则。在您的情况下,当您在按钮上设置onClickListener时,最相关的事实是,您实际在做的是将引用传递给OnClickListener类的实例。在Java中,您可以创建一个匿名内部类,这意味着不是定义一些实现onClickListener的顶级类(顺便说一句,您可以轻松地通过让所有这些发生的类简单地声明它实现onClickListener接口) ,例如public class WhateverMyClassNameIs extends Activity implements View.OnClickListener
)你实际上只是创建一个未命名的,onClickListener实例,由于你没有声明对它的引用,因此无法在其他任何地方引用它。现在,问题在于这个onClicklistener实例内部,当你想现在引用它所定义的外部类(在你的情况下,是Activity类)时,你不能再使用“this”了,因为“this”实际上是onClickListener,因为“范围”的工作方式。换句话说,OnClickListener没有名为“startActivity”的方法;只有一个Activity类(或者你的类扩展了Activity)。所以你必须使用所谓的“合格的”来澄清你打算引用“外类”,这就是你需要*MyActivity*.this.startActivity...
Manifest(我已经拥有)的一部分许可我要改变 布局上的东西?
清单和布局文件是两个完全不同的东西。它们都是使用XML定义的,但它们完全不同。除其他外,清单包含应用程序请求的所有活动类和权限的声明等。布局文件是活动(UI)中使用的实际布局。它们应位于res / layout中,您可以在那里定义任何您想要的内容。当你需要让那个UI“活着”时,你必须在代码中的Activity里面获取对你的小部件(按钮,文本视图)等的引用,然后在那里做你想做的事。