android - 使用自定义样式时微调器导致错误

标签 android android-spinner android-styles

首先,我是 Android 编程的新手,Stackoverflow 和其他网站一样提供了很多帮助。但是对于我现在遇到的问题,我还没有找到解决方案。我正在创建的应用程序因以下错误而崩溃:

AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.RuntimeException: Binary XML file line #19: You must supply a layout_height attribute.
        at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:491)
        at android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:5319)
        at android.view.ViewGroup$LayoutParams.<init>(ViewGroup.java:5271)
        at android.view.ViewGroup.generateLayoutParams(ViewGroup.java:4471)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:477)
        at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
        at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:371)
        at android.widget.ArrayAdapter.getView(ArrayAdapter.java:362)
        at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:192)
        at android.widget.Spinner.onMeasure(Spinner.java:296)
        at android.view.View.measure(View.java:12751)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369)
        at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1017)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:555)
        at android.view.View.measure(View.java:12751)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1369)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:660)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
        at android.view.View.measure(View.java:12751)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:812)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
        at android.view.View.measure(View.java:12751)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
        at android.view.View.measure(View.java:12751)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
        at android.view.View.measure(View.java:12751)
        at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:594)
        at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:376)
        at android.view.View.measure(View.java:12751)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
        at android.view.View.measure(View.java:12751)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:812)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
        at android.view.View.measure(View.java:12751)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
        at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2120)
        at android.view.View.measure(View.java:12751)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1106)
        at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2558)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:4697)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:511)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554)
        at dalvik.system.NativeStart.main(Native Method)

首先,我检查了显而易见的内容,并检查了我在所有内容上都使用 layout_height 的所有布局文件,并且我确实在所有地方都使用了它。因此,我进行了更多研究并发现了正在发生的事情。

关于 http://jgilfelt.github.io/android-actionbarstylegenerator/我创建了一个自定义样式并下载了 zip 文件,然后将其解压缩到我的项目中(顺便说一句,我使用的是 Android-Studio)。运行该应用程序时,它的样式与 zip 文件中的内容相得益彰。

当向布局添加微调器并在其上设置 ArrayAdapter 时,会导致我的应用程序因上述堆栈跟踪而崩溃。在问题中使用 setAdapter 很重要,因为在省略或注释它时不会发生错误,但微调器也不会填充,但它的箭头会显示。将样式恢复为默认样式会使应用程序按预期工作而不会出现问题。这种行为在模拟器和真实设备上都出现过,在后期甚至经常重启。

我还创建了一个测试应用程序,看看是不是我应用程序中的其他任何东西导致了这个问题,但在这个测试应用程序中我也注意到了同样的行为。非常感谢解决此问题的任何帮助。以下是该测试应用程序的代码。

布局文件activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.example.testspinnertheme.MainActivity">

    <TextView
        android:text="@string/hello_world"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView" />

    <Spinner
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/spinner"
        android:layout_below="@+id/textView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>

java文件MainActivity.java

package com.example.testspinnertheme;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.Spinner;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String[] strings = new String[]{"one", "two", "three", "four"};
        ArrayAdapter<String> aaString = new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item, strings);
        aaString.setDropDownViewResource(R.layout.support_simple_spinner_dropdown_item);
        spinnerDistance.setAdapter(aaString);

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }
}

list 文件AndroidManifest.xml

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

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.Test" >
        <activity
            android:name="com.example.testspinnertheme.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
</manifest>

下面的样式文件(styles_test.xml)实际上是由上面提到的网站创建的

<?xml version="1.0" encoding="utf-8"?>
<!-- File created by the Android Action Bar Style Generator

 Copyright (C) 2011 The Android Open Source Project
 Copyright (C) 2012 readyState Software Ltd

 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
 You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License.
-->

<resources>

    <style name="Theme.Test" parent="@android:style/Theme.Holo.Light">
        <item name="android:actionBarItemBackground">@drawable/selectable_background_test</item>
        <item name="android:popupMenuStyle">@style/PopupMenu.Test</item>
        <item name="android:dropDownListViewStyle">@style/DropDownListView.Test</item>
        <item name="android:actionBarTabStyle">@style/ActionBarTabStyle.Test</item>
        <item name="android:actionDropDownStyle">@style/DropDownNav.Test</item>
        <item name="android:actionBarStyle">@style/ActionBar.Solid.Test</item>
        <item name="android:actionModeBackground">@drawable/cab_background_top_test</item>
        <item name="android:actionModeSplitBackground">@drawable/cab_background_bottom_test</item>
        <item name="android:actionModeCloseButtonStyle">@style/ActionButton.CloseMode.Test</item>
    </style>

    <style name="ActionBar.Solid.Test" parent="@android:style/Widget.Holo.Light.ActionBar.Solid">
        <item name="android:background">@drawable/ab_solid_test</item>
        <item name="android:backgroundStacked">@drawable/ab_stacked_solid_test</item>
        <item name="android:backgroundSplit">@drawable/ab_bottom_solid_test</item>
        <item name="android:progressBarStyle">@style/ProgressBar.Test</item>
    </style>

    <style name="ActionBar.Transparent.Test" parent="@android:style/Widget.Holo.Light.ActionBar">
        <item name="android:background">@drawable/ab_transparent_test</item>
        <item name="android:progressBarStyle">@style/ProgressBar.Test</item>
    </style>

    <style name="PopupMenu.Test" parent="@android:style/Widget.Holo.Light.ListPopupWindow">
        <item name="android:popupBackground">@drawable/menu_dropdown_panel_test</item>  
    </style>

    <style name="DropDownListView.Test" parent="@android:style/Widget.Holo.Light.ListView.DropDown">
        <item name="android:listSelector">@drawable/selectable_background_test</item>
    </style>

    <style name="ActionBarTabStyle.Test" parent="@android:style/Widget.Holo.Light.ActionBar.TabView">
        <item name="android:background">@drawable/tab_indicator_ab_test</item>
    </style>

    <style name="DropDownNav.Test" parent="@android:style/Widget.Holo.Light.Spinner">
        <item name="android:background">@drawable/spinner_background_ab_test</item>
        <item name="android:popupBackground">@drawable/menu_dropdown_panel_test</item>
        <item name="android:dropDownSelector">@drawable/selectable_background_test</item>
    </style>

    <style name="ProgressBar.Test" parent="@android:style/Widget.Holo.Light.ProgressBar.Horizontal">
        <item name="android:progressDrawable">@drawable/progress_horizontal_test</item>
    </style>

    <style name="ActionButton.CloseMode.Test" parent="@android:style/Widget.Holo.Light.ActionButton.CloseMode">
        <item name="android:background">@drawable/btn_cab_done_test</item>
    </style>

    <!-- this style is only referenced in a Light.DarkActionBar based theme -->
    <style name="Theme.Test.Widget" parent="@android:style/Theme.Holo">
        <item name="android:popupMenuStyle">@style/PopupMenu.Test</item>
        <item name="android:dropDownListViewStyle">@style/DropDownListView.Test</item>
    </style>

</resources>

最佳答案

您在使用 Eclipse 吗?一旦我收到这个错误,我就通过清理项目解决了它

关于android - 使用自定义样式时微调器导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24957967/

相关文章:

Android:如何为发布变体重置 resConfigs?

安卓 Activity

android - 如何使用 EditText 在一行中设置 Spinner

android - 为什么在 ActionBar 中创建导航下拉菜单时文本是黑色而不是白色?

android - Android Studio 中的多个 styles.xml 文件

javascript - WebView加载HTML但不显示

android - 加载 YouTube 视频时出现 ActivityNotFoundException

android - 特定组件类型的主题属性

android - 微调标签大小

java - Android 样式更改不适用于三星设备