AppCompat - Spinner не работи в RelativeLayout

Получавам следната грешка (използване на най-новата библиотека за поддръжка v23.0 и изграждане на SDK 23):

Случай 1: Android 4.2.1

java.lang.NullPointerException
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:523)
at android.view.View.measure(View.java:15612)
at android.support.v7.internal.widget.ListViewCompat.measureHeightOfChildrenCompat(ListViewCompat.java:301)
at android.support.v7.widget.ListPopupWindow.buildDropDown(ListPopupWindow.java:1200)
at android.support.v7.widget.ListPopupWindow.show(ListPopupWindow.java:584)
at android.support.v7.widget.AppCompatSpinner$DropdownPopup.show(AppCompatSpinner.java:766)
at android.support.v7.widget.AppCompatSpinner.performClick(AppCompatSpinner.java:424)
at android.view.View$PerformClick.run(View.java:17439)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:153)
at android.app.ActivityThread.main(ActivityThread.java:5341)
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:929)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
at dalvik.system.NativeStart.main(Native Method)

Случай 2: Android 4.3

java.lang.NullPointerException
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:578)
at android.view.View.measure(View.java:16831)
at android.support.v7.internal.widget.ListViewCompat.measureHeightOfChildrenCompat(ListViewCompat.java:301)
at android.support.v7.widget.ListPopupWindow.buildDropDown(ListPopupWindow.java:1200)
at android.support.v7.widget.ListPopupWindow.show(ListPopupWindow.java:584)
at android.support.v7.widget.AppCompatSpinner$DropdownPopup.show(AppCompatSpinner.java:766)
at android.support.v7.widget.AppCompatSpinner.performClick(AppCompatSpinner.java:424)
at android.view.View$PerformClick.run(View.java:18786)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
at dalvik.system.NativeStart.main(Native Method)

Всъщност не знам откъде да започна търсенето. Получавам тази грешка от сривове и не мога да я възпроизведа на телефона си. И не знам откъде наистина идва.

Търсих в кода си и нямам Spinner директно вложен в нито един RelativeLayout...

Някой има ли намек какво може да причини този проблем?

Промени в моя код, които направих

Основно актуализирах от библиотеката за поддръжка и изградих sdk v22 до v23. И никога преди не съм имал подобен проблем...

Причина за грешка, демонстрирана въз основа на грешката в Android 4.2.1:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.1_r1.2/android/widget/RelativeLayout.java#RelativeLayout

Тук в ред 523... Това получавам от доклада за грешка, който получавам...

523 if (mLayoutParams.height >= 0) {
524 height = Math.max(height, mLayoutParams.height);
525 }

В android 4.3 всъщност е същият проблем, mLayoutParams е нула...


person prom85    schedule 04.09.2015    source източник
comment
поддръжката на актуализацията 23.0.1 може да е решението му   -  person Dhaval Parmar    schedule 04.09.2015
comment
Мога да направя това, но проблемът не е посочен тук: developer.android.com/ tools/support-library/index.html. Така че не съм сигурен дали проблемът е причинен от библиотеката за поддръжка...   -  person prom85    schedule 04.09.2015
comment
java.lang.NullPointerException   -  person Phantômaxx    schedule 04.09.2015
comment
@FrankN.Stein какво означава това?   -  person prom85    schedule 04.09.2015
comment
Публикувайте някакъв код - грешката е там: препращате към нулев обект.   -  person Phantômaxx    schedule 04.09.2015
comment
Сигурен съм, че кодът не е проблемът, имам хиляди стартирани инсталации и имам около 3 срива (разбира се, не съм сигурен, така че всеки съвет помага)... И не мога да го възпроизведа на телефона си, може да отвори всеки един спинер в моето приложение и нищо никога не се срива. И получавам само над регистъра на сривовете, нищо повече. Просто не мога да определя откъде в моя код идва тази грешка... така че не мога да публикувам някакъв код, иначе, разбира се, вече щях да го направя...   -  person prom85    schedule 04.09.2015
comment
@prom85 бих погледнал изходния код на RelativeLayout androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/. ред 523 се отнася до for (int i = 0; i < count; i++). Също така на кое устройство забива   -  person Raghunandan    schedule 04.09.2015
comment
Получих отчети от 4.2.1, 4.2.2 и 4.3... И имам устройство с Android 5.0 без проблеми...   -  person prom85    schedule 04.09.2015
comment
PS: различно е от това, което сте публикували. Добавих и основния код към въпроса си и препратка към изходния код RelativeLayout...   -  person prom85    schedule 04.09.2015
comment
PPS: Добавих изключението и за android 4.3 и по-добре описах към коя версия на android принадлежат изключенията...   -  person prom85    schedule 04.09.2015


Отговори (4)


Намерих причината.

Използвам много адаптери и в един от тях случайно прикачих изгледа към основния изглед... Това изглежда не е проблем на повечето устройства и версии на Android, но на някои...

convertView = mInflater.inflate(mLayoutRes, null);

Би трябвало

convertView = mInflater.inflate(mLayoutRes, null, false);

ако адаптерът се използва в Spinner...

person prom85    schedule 07.09.2015
comment
Имах този проблем, за да надстроя моя проект за Android 22 до 23, работещ на устройство с Android 17. Неговото решение работи за мен. Благодаря ти. - person Douglas Nassif Roma Junior; 22.09.2015
comment
Трябваше да добавя и групата за преглед вместо нула. - person Geob-o-matic; 10.10.2015

Опитайте да използвате следния код:

activity_main.xml

    <RelativeLayout xmlns:androclass="http://schemas.android.com/apk/res/android"  
        xmlns:tools="http://schemas.android.com/tools"  
        android:layout_width="match_parent"  
        android:layout_height="match_parent"  
        tools:context=".MainActivity" >  

        <Spinner  
            android:id="@+id/spinner1"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_alignParentTop="true"  
            android:layout_centerHorizontal="true"  
            android:layout_marginTop="83dp" />  

    </RelativeLayout>  

MainActivity.java:

package com.example.spinner;  
import android.app.Activity;  
import android.os.Bundle;  
import android.view.Menu;  
import android.view.View;  
import android.widget.AdapterView;  
import android.widget.ArrayAdapter;  
import android.widget.Spinner;  
import android.widget.TextView;  
import android.widget.Toast;  

public class MainActivity extends Activity implements  
AdapterView.OnItemSelectedListener {  

    String[] country = { "India", "USA", "China", "Japan", "Other",  };  

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        //Getting the instance of Spinner and applying OnItemSelectedListener on it  
        Spinner spin = (Spinner) findViewById(R.id.spinner1);  
        spin.setOnItemSelectedListener(this);  


        ArrayAdapter aa = new ArrayAdapter(this,android.R.layout.simple_spinner_item,country);  
        aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);  

        spin.setAdapter(aa);  
    }  



    @Override  
    public void onItemSelected(AdapterView<?> arg0, View arg1, int position,long id) {  
        Toast.makeText(getApplicationContext(),country[position] ,Toast.LENGTH_LONG).show();  
    }  

    @Override  
    public void onNothingSelected(AdapterView<?> arg0) {  
        // TODO Auto-generated method stub  

    }  

    @Override  
    public boolean onCreateOptionsMenu(Menu menu) {  
        // Inflate the menu; this adds items to the action bar if it is present.  
        getMenuInflater().inflate(R.menu.activity_main, menu);  
        return true;  
    }  
}  
person Vinay Pandravada    schedule 04.09.2015
comment
Не мога да възпроизведа грешката. Само някои устройства го имат. И моето приложение работи вече една година без проблеми, така че или въведох грешка, или новата библиотека за поддръжка има такава... - person prom85; 04.09.2015
comment
Значи приложението работи на някои устройства в момента?? - person Vinay Pandravada; 04.09.2015
comment
Точно. На моето устройство мога да използвам всеки един спинер без проблеми - person prom85; 04.09.2015
comment
Не знам дали това работи, но опитайте да добавите setContentView(R.layout.your_layout_content); към метода onCreate, преди да инициализирате неговите изгледи. - person Vinay Pandravada; 04.09.2015

Хващате изключението, в случай че раздувате оформление, което има само изглед (без ViewGroup). Пример android:layout/simple_spinner_dropdown_item има само CheckedTextView:

<?xml version="1.0" encoding="utf-8"?>
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    style="?android:attr/spinnerDropDownItemStyle"
    android:singleLine="true"
    android:layout_width="match_parent"
    android:layout_height="?android:attr/dropdownListPreferredItemHeight"
    android:ellipsize="marquee"/>

Можете да го поправите, като добавите ViewGroup в оформлението на изгледа на вашия адаптерен елемент:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <include layout="@android:layout/simple_spinner_dropdown_item"/>
</LinearLayout>
person sondt87    schedule 16.09.2015

Решението @prom85 не работеше за мен, докато не преминах parent ViewGroup вместо null:

convertView = mInflater.inflate(mLayoutRes, parent, false);
person M.Sameer    schedule 10.10.2015
comment
обикновено родителят е необходим само ако искате да използвате неговата тема, така че е добре да използвате родителя винаги, когато е възможно... - person prom85; 10.10.2015