【问题标题】:ADK - Unable to find layout using R.id.xADK - 无法使用 R.id.x 找到布局
【发布时间】:2012-11-25 08:59:42
【问题描述】:

我正在尝试更改我的 Android 应用的背景颜色(我是 ADK 的新手)。
我在另一个问题中读到,我必须在我的主布局(RelativeLayout)和应用程序中的所有其他视图之间使用另一个 LinearLayout,并改为更改它的颜色。我想要一个偏好来指示背景更改为哪种颜色,以及偏好活动和一切运行顺利;但是,当我将 R.id.bg(bg 是 LinearLayout 的 ID)传递给 findViewById() 时,每当我尝试更改背景颜色时,它都会返回 null 并抛出 NPE。

编辑:你知道吗,这是整个课程的来源。 :P

public class Preferences extends PreferenceActivity implements
    OnSharedPreferenceChangeListener {

    SharedPreferences prefs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);

        prefs = PreferenceManager.getDefaultSharedPreferences(this);
        prefs.registerOnSharedPreferenceChangeListener(this);

    }

    private void showToast(CharSequence text) {
        Context context = getApplicationContext();
        showToast(context, text, 3000);
    }

    private void showToast(Context context, CharSequence text, int duration) {
            Toast toast = Toast.makeText(context, text, duration);
            toast.show();
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
            String key) {

        if (key.equalsIgnoreCase("list_color")) {

            LinearLayout bg = (LinearLayout) findViewById(R.id.bg);
            String color = sharedPreferences.getString("list_color", "White");

            if (bg == null) {

                showToast("Unable to change background color");

            } else {

                if (color.equals("White")) {
                    bg.setBackgroundColor(android.R.color.white);
                    showToast("Background color set to white");
                } else if (color.equals("Black")) {
                    bg.setBackgroundColor(android.R.color.black);
                    showToast("Background color set to black");
                }

            } // end NP test

        }

    }
}

【问题讨论】:

    标签: android eclipse background adt


    【解决方案1】:

    您无法以传统方式直接从首选项中获取View

    您可以做的最接近的方法是使用findPreference() 获取Preference

    Preference myPreference = findPreference("key");
    

    如果你需要View(我假设你需要),你可以试试这个:

    View v = myPreference.getView(null, null);
    

    这应该返回代表PreferenceView容器。

    【讨论】:

    • 谢谢,我再看看。如果首选项是 ListPreference,我如何从 Preference 中获取选定的值?
    • 使用ListPreference pref = (ListPreference) ...;将其转换为ListPreference
    • 哦,好的,我们开始了。所以现在当我更改背景颜色 preference 时,消息显示“背景已更改为 ...”,但背景没有更改。我假设这只是意味着我不能这样做,或者我使用 myPreference.getView(null, null); 获取了错误的视图。
    • 此外,每当我更改首选项值时,它都会给我两个 Toast 弹出窗口:总是首先是“黑色”,然后是“白色”。
    • 看看这里:stackoverflow.com/questions/3551169/… ...如果这些方法不起作用,我会认为它无法完成(并且可能因 API 而异)。此外,只有在偏好更改两次时,吐司故障才有意义。 registerOnSharedPreferenceChangeListener 可能会被调用两次。在onDestroy() 中致电unregisterOnSharedPreferenceChangeListener
    【解决方案2】:

    显示您的 onCreate 方法。 可能你忘了加setContentView(R.layout.your_layout);

    super.onCreate(savedInstanceState);
    setContentView(R.layout.your_layout);
    

    或导入错误的 R 文件。

    【讨论】:

    • 嗯,它在 PreferenceActivity 扩展类中,但无论如何我都会这样做。我需要将内容视图设置为 LinearLayout 还是 RelativeLayout? (RelativeLayout 是应用程序的主要布局,LinearLayout 仅用于背景颜色。)
    • 如果是 PreferenceActivity 则需要在 onCreate 中添加类似的内容:addPreferencesFromResource(R.xml.preferences);
    • 是的,addPreferencesFromResource(R.xml.preferences);在 onCreate() 中。但是在 onCreate() 中我需要添加 setContentView(R.layout.main); ?
    • 您没有在偏好活动中添加setContentView
    • 我做了setContentView(R.layout.activity_main)(我的主要布局),它所做的只是让应用程序崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 1970-01-01
    • 2017-03-12
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多