我正在尝试理解android中的一些代码。我看到
<activity
android:name="Settings$DemoRangeActivity"
有人能解释名称中$符号的意义或用法吗。我找不到任何名为DemoRangeActivity的活动。这是我想要的吗?
感谢
Settings$DemoRangeActivity
是对Settings
类中定义的内部类DemoRangeActivity
的引用。如果您注意到这个类在清单中被引用,但实际上没有在Settings
类中定义,那么一旦这个特定类作为Activity
打开,应用程序就会崩溃。
在AOSP的设置应用程序部分,更具体地说,在Settings.java
文件中,与设置应用程序相关的每个活动都在文件底部引用,并带有一个空正文。它们都扩展了Settings
类。这涉及到以下内容:
/*
* Settings subclasses for launching independently.
*/
public static class BluetoothSettingsActivity extends Settings { /* empty */ }
public static class WirelessSettingsActivity extends Settings { /* empty */ }
...
正如您所提到的,这些文件中的每一个通常都有一个在单独的源文件中实现的相关片段,该文件扩展了SettingsPreferenceFragment
类。这样做是为了让您的片段(在另一个文件中实现)可以作为一个活动单独启动。如果仔细观察,Settings
类就是PreferenceActivity
。
如果您要将自己的片段添加到Settings应用程序,您可能需要在Settings.java
文件及其清单文件中声明它。因此,基本上,您将在一个单独的文件中有一个DemoRange
片段,以及在Settings.java
和清单文件中声明的DemoRangeActivity
,这样的声明的示例是:
<!-- Demo range settings activity -->
<activity android:name="Settings$DemoRangeActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="com.android.settings.SHORTCUT" />
</intent-filter>
<!-- Here is your actual binding between the activity and the fragment -->
<meta-data android:name="com.android.settings.FRAGMENT_CLASS"
android:value="com.android.settings.DemoRange" />
<meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
android:resource="@id/demo_range_settings" />
</activity>