【问题标题】:Add a button to the bottom of Preferences Screen在首选项屏幕底部添加一个按钮
【发布时间】:2023-03-14 06:55:01
【问题描述】:

尽管@stealthcopter 的评论内容(检查@Andrew 的回答)在这个问题How to add a button to PreferenceScreen 中,我无法在我的活动底部看到一个按钮。

应用程序 .apk 将崩溃并出现以下错误:Unfortunately your_app has stopped working!

这是崩溃的堆栈跟踪:

05-25 21:26:39.431: I/dalvikvm(1405): threadid=3: reacting to signal 3
05-25 21:26:39.462: I/dalvikvm(1405): Wrote stack traces to '/data/anr/traces.txt'
05-25 21:26:44.851: I/Process(1405): Sending signal. PID: 1405 SIG: 9
05-25 21:40:51.442: I/dalvikvm(1936): threadid=3: reacting to signal 3
05-25 21:40:51.601: I/dalvikvm(1936): Wrote stack traces to '/data/anr/traces.txt'
05-25 21:40:51.951: I/dalvikvm(1936): threadid=3: reacting to signal 3
05-25 21:40:52.001: I/dalvikvm(1936): Wrote stack traces to '/data/anr/traces.txt'
05-25 21:40:52.472: I/dalvikvm(1936): threadid=3: reacting to signal 3
05-25 21:40:52.561: I/dalvikvm(1936): Wrote stack traces to '/data/anr/traces.txt'
05-25 21:40:52.631: D/dalvikvm(1936): GC_CONCURRENT freed 172K, 4% free 9313K/9607K, paused 7ms+7ms
05-25 21:40:52.691: D/gralloc_goldfish(1936): Emulator without GPU emulation detected.
05-25 21:40:54.372: D/AndroidRuntime(1936): Shutting down VM
05-25 21:40:54.372: W/dalvikvm(1936): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
05-25 21:40:54.422: E/AndroidRuntime(1936): FATAL EXCEPTION: main
05-25 21:40:54.422: E/AndroidRuntime(1936): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.DVA_HLUI/com.DVA_HLUI.DVA_HLUIPrefsActivity}: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1956)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.app.ActivityThread.startActivityNow(ActivityThread.java:1797)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:682)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.widget.TabHost.setCurrentTab(TabHost.java:346)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:150)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:540)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.view.View.performClick(View.java:3511)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.view.View$PerformClick.run(View.java:14105)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.os.Handler.handleCallback(Handler.java:605)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.os.Handler.dispatchMessage(Handler.java:92)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.os.Looper.loop(Looper.java:137)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.app.ActivityThread.main(ActivityThread.java:4424)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at java.lang.reflect.Method.invokeNative(Native Method)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at java.lang.reflect.Method.invoke(Method.java:511)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at dalvik.system.NativeStart.main(Native Method)
05-25 21:40:54.422: E/AndroidRuntime(1936): Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.app.ListActivity.onContentChanged(ListActivity.java:243)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.preference.PreferenceActivity.onContentChanged(PreferenceActivity.java:944)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:254)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.app.Activity.setContentView(Activity.java:1835)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at com.DVA_HLUI.DVA_HLUIPrefsActivity.onCreate(DVA_HLUIPrefsActivity.java:15)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.app.Activity.performCreate(Activity.java:4465)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
05-25 21:40:54.422: E/AndroidRuntime(1936):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1920)
05-25 21:40:54.422: E/AndroidRuntime(1936):     ... 18 more

这是崩溃的活动java类:

public class DVA_HLUIPrefsActivity extends PreferenceActivity 
{
   @Override
   public void onCreate(Bundle savedInstanceState) 
   { 
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.prefs);
        setContentView(R.layout.preferences);
   }
}

这是它的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" android:layout_weight="1">
    </ListView>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">

        <Button
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Quit!" android:layout_weight="0.5"android:layout_gravity="center_vertical"
         />

        <Button
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:text="Help" android:layout_weight="0.5" android:layout_gravity="center_vertical"
         />

    </LinearLayout>

</LinearLayout>

最后这是首选项 xml 资源:

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >

    <Preference android:key="about" android:title="@string/titleAbout" android:summary="@string/summaryAbout" />


</PreferenceScreen>

您能否解释一下导致应用程序崩溃的冲突是什么?

【问题讨论】:

  • 请添加崩溃时的堆栈跟踪。
  • @Pulsar 添加了堆栈跟踪
  • 在堆栈跟踪中是您正在寻找的答案。似乎也有人解释过。
  • 您只需要在代码中更改的是该答案中列出的内容,即列表视图的android:id="@android:id/list" 属性。
  • @+id/listyour 资源添加一个名为 list 的新 id,同时使用已定义的 id,在本例中为 android 本身:@android:id/list

标签: java android xml android-activity android-preferences


【解决方案1】:

您必须包含一个 ID 为 @android:id/list 的 ListView,就像它在您链接到的问题中所说的那样(参见 Answer)。

从您的 android 布局文件 (R.Layout.Preferences) 中删除您的 &lt;ListView&gt; 并将其放在原处。

<ListView android:id="@android:id/list" 
  android:layout_width="fill_parent"
  android:layout_height="fill_parent" />

这应该可以解决您遇到的问题。

从您发布的 LogCat 中: Caused by: java.lang.RuntimeException: Your content must have a ListView whose id attribute is 'android.R.id.list'


编辑:只是对 ListView 上的 id 属性的一些说明。来自Android XML Layouts

在 XML 标记中,ID 的语法是:

android:id="@+id/my_button"

字符串开头的符号 (@) 表示 XML 解析器应该解析和扩展 ID 字符串的其余部分,并将其标识为 ID 资源。加号 (+) 表示这是一个新的资源名称,必须创建并添加到我们的资源中(在 R.java 文件中)。 Android 框架还提供了许多其他 ID 资源。引用 Android 资源 ID 时,不需要加号,但必须添加 android 包命名空间,如下所示:

android:id="@android:id/empty"

有了 android 包命名空间,我们现在从 android.R 资源类而不是本地资源类引用 ID。

【讨论】:

  • Answer 中写成preferences defined the usual way in res/xml/preferences.xml,这正是我对 标签所做的
  • 嘿@Matteo 你的 R.xml.prefs 看起来不错,你不需要改变它。您只需要在 R.layout.preferences 文件中更改 ListView 的 android:id 即可。我看到您已将 ListView 的 id 更改为“@+id/list”...它必须是“@android:id/list”。让我知道这是否可以为您解决问题
  • 是的,这就是问题所在!非常感谢您的帮助。顺便说一句,这两种写 id 的方式有什么区别?
  • @Matteo 太棒了!我很高兴为您解决了问题。我在答案中添加了更多细节来解释为什么这些不同。基本上,我们不想创建一个新的 ListView,我们只想使用 PreferenceScreen 所期望的标准 Android ListView。
  • 这对我很有帮助,抱歉我不能 +2... ;D 再次感谢,再见 ;D
猜你喜欢
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 2022-11-12
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
相关资源
最近更新 更多