2

你好 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);
    }
}
});

但是我收到了一些错误,可能是因为我也无法理解它!

这些是我的问题:

  • 为什么有必要声明一个按钮(gpsButton)以及我可以在哪里/如何创建它?
  • 代码可以整体放在 MapActivity 类之后还是必须放在第一个 onCreate 之后?
  • 什么是外层?
  • Manifest 的部分权限(我已经拥有)我必须更改 Layout 上的某些内容?

所以,一般来说,有人可以更好地解释我如何使用这段代码以及我需要做什么修改。

如果您需要,我可以发送我的整个 Java 代码。

提前感谢您的到来。

带着敬意,

克劳迪奥

4

1 回答 1

1

好吧,你在这里有几个问题。

为什么有必要声明一个按钮(gpsButton)以及我可以在哪里/如何创建它?

如果你想创建一个按钮,那么你可以在 Activity 使用的 XML 布局中声明它,或者你可以在代码中添加它。如果您只是从一些示例中粘贴代码,您需要了解此代码实际上是通过在当前视图层次结构(即当前正在显示的布局)中通过它的 id 找到它来创建对 Button 对象的引用。因此,如果您没有在 XML 中的某处创建一个 ID 为 buttonGPSLocation 的按钮,那么此代码将不起作用。至于为什么它是必要的:似乎样本的作者决定提示用户点击一个按钮以打开手机设置并启用 GPS。

代码可以整体放在 MapActivity 类之后还是必须放在第一个 onCreate 之后?

这个问题不是很清楚(这里可能是语言问题),但如果您发布所有相关代码可能会有所帮助。一般来说,设置 onClickListeners 可能应该在你的 Activity 的 onCreate 中完成。是否在 MapActivity 内部完成取决​​于您未提供给我们的更多信息。

什么是外层?

在 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 的类)。因此,您必须使用所谓的“限定 this”来澄清您打算引用“外部类”,这就是您需要的原因*MyActivity*.this.startActivity...

Manifest 的部分权限(我已经拥有)我必须更改 Layout 上的某些内容?

清单文件和布局文件是两个完全不同的东西。它们都是使用 XML 定义的,但它们完全不同。除其他外,清单包含应用程序请求的所有活动类和权限的声明等。布局文件是活动(UI)内部使用的实际布局。它们应该位于 res/layout 中,你可以在那里定义任何你想要的东西。当您需要使该 UI “活跃”时,您必须在代码中的 Activity 中获取对您的小部件(按钮、文本视图)等的引用,然后在那里做您想做的事情。

于 2012-11-18T01:56:48.933 回答