【问题标题】:How to prompt user to enable GPS如何提示用户启用 GPS
【发布时间】:2012-11-18 01:02:16
【问题描述】:

你好 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之后?
  • 什么是 OUTERCLASS?
  • Manifest 上的部分权限(我已经拥有)我必须更改 Layout 上的某些内容?

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

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

提前感谢您的光临。

关于,

克劳迪奥

【问题讨论】:

  • 不鼓励在一个问题中提出多个问题

标签: android android-layout android-mapview android-maps


【解决方案1】:

嗯,你有几个问题。

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

如果你想创建一个按钮,那么你可以在 Activity 使用的 XML 布局中声明它,或者你可以在代码中添加它。如果您只是从一些示例中粘贴代码,您需要了解此代码实际上是通过在当前视图层次结构(即当前正在显示的布局)中通过它的 id 找到它来创建对 Button 对象的引用。因此,如果您没有在 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 的类)。所以你必须使用所谓的“限定 this”来澄清你打算引用“外部类”,这就是为什么你需要*MyActivity*.this.startActivity...

Manifest 上的部分权限(我已经拥有)我要更改 布局上有什么?

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

【讨论】:

  • 感谢您的回答。也许我必须为 Android User Interface 下的“Dialogs”类付出我的努力。 link。这个是定制的,以提示用户警报对话。无论如何,我要感谢您准备好的答案!下一篇文章见。再见
  • @user1832799,没问题。如果对您有帮助,您可以接受。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2014-04-26
相关资源
最近更新 更多