4

'a atandığında bir spikerde SetSelection kilitleniyor Bu sorunu nerede yaşadığımı belirlemek için basitleştirilmiş bir deney yaptım. Daha önce bir sürü kodla uzun bir soruydu. Şimdi bir küçük ve basit bir kod tutmuş: Ben layout_width = 0DP belirledik çünkülayout_weight spinner

java.lang.NullPointerException: Attempt to read from field 'int android.view.ViewGroup$LayoutParams.width' on a null object reference 
    at android.widget.TextView.checkForRelayout(TextView.java:6830) 
    at android.widget.TextView.onRtlPropertiesChanged(TextView.java:8948) 
    at android.view.View.resolveRtlPropertiesIfNeeded(View.java:13118) 
    at android.view.View.measure(View.java:17557) 
    at android.widget.Spinner.setUpChild(Spinner.java:657) 
    at android.widget.Spinner.makeView(Spinner.java:610) 
    at android.widget.Spinner.getBaseline(Spinner.java:456) 
    at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1294) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:615) 
    at android.view.View.measure(View.java:17562) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5536) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 
    at android.view.View.measure(View.java:17562) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5536) 
    at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436) 
    at android.widget.LinearLayout.measureVertical(LinearLayout.java:722) 
    at android.widget.LinearLayout.onMeasure(LinearLayout.java:613) 
    at android.view.View.measure(View.java:17562) 
    at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5536) 
    at android.widget.FrameLayout.onMeasure(FrameLayout.java:436) 
    at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2871) 
    at android.view.View.measure(View.java:17562) 
    at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2015) 
    at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1173) 
    at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1379) 
    at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1061) 
    at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5891) 
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
    at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
    at android.view.Choreographer.doFrame(Choreographer.java:550) 
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
    at android.os.Handler.handleCallback(Handler.java:739) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:135) 
    at android.app.ActivityThread.main(ActivityThread.java:5294) 
    at java.lang.reflect.Method.invoke(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:372) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699) 

Bu hata geliyor:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_spinner_test); 

    Spinner spin1 = (Spinner) findViewById(R.id.spin1); 
    spin1.setAdapter(new ProfileSpinnerAdapter(this, R.array.feet)); 
    spin1.setSelection(0); //does not crash 
    spin1.setSelection(getResources().getStringArray(R.array.feet).length - 1); //it crashes 
    //it crashes for any value greater than 0 and less than array length. 

Bu hatadır. Ancak aynı zamanda layout_weight = 1. NOT: Ayarlayıcı, ayarlandığında, uygun şekilde şişirilir (0). Yani sorun düz ileri enflasyon ile değil. mükemmel

<LinearLayout 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:orientation="horizontal" 
tools:context="in.jiyofit.the_app.SpinnerTestActivity"> 

<Spinner 
    android:id="@+id/spin1" 
    android:layout_width="0dp" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" /> 

bütün kod eserler layout_width = eğer olmayan herhangi sıfır dp veya match_parent veya wrap_content hiçbir layout_weight varken: Burada

xml olduğunu.

Ancak aynı yukarıdaki düzeni ile aşağıdaki kod hiçbir çöker ile düzgün çalışır:

Böylece
Spinner spin1 = (Spinner) findViewById(R.id.spin1); 
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, 
      R.array.feet, android.R.layout.simple_spinner_item); 
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
    spin1.setAdapter(adapter); 
    spin1.setSelection(getResources().getStringArray(R.array.feet).length - 1); 

Ben layout_weight ile çakışan Ben yaptık ProfileSpinnerAdapter sınıfıyla bazı sorunlar olduğu sonucuna varabiliriz = 1 ve

public class ProfileSpinnerAdapter extends BaseAdapter { 
String[] array; 
Context ctx; 

public ProfileSpinnerAdapter(Context context, int arrayID) { 
    this.ctx = context; 
    this.array = ctx.getResources().getStringArray(arrayID); 
} 

@Override 
public int getCount() { 
    return array.length; 
} 

@Override 
public Object getItem(int position) { 
    return array[position]; 
} 

@Override 
public long getItemId(int position) { 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    TextView textView = new TextView(ctx); 
    textView.setText(array[position]); 
    textView.setTextSize(16); 
    if(array[position].length() > 6){ 
     Typeface hindiFont = Typeface.createFromAsset(ctx.getAssets(),"fonts/mfdev010.ttf"); 
     textView.setTextSize(22); 
     textView.setTypeface(hindiFont); 
    } 
    if(position == 0){ 
     textView.setTextColor(ContextCompat.getColor(ctx, R.color.primaryText)); 
    } 
    return textView; 
} 

@Override 
public View getDropDownView(int position, View convertView, ViewGroup parent) { 
    TextView textView = new TextView(ctx); 
    textView.setText(array[position]); 
    textView.setTextSize(16); 
    textView.setPadding(0, 5, 0, 0); 
    if(array[position].length() > 6){ 
     Typeface hindiFont = Typeface.createFromAsset(ctx.getAssets(),"fonts/mfdev010.ttf"); 
     textView.setTextSize(22); 
     textView.setTypeface(hindiFont); 
     textView.setPadding(10,5,10,5); 
    } 
    textView.setBackgroundColor(ContextCompat.getColor(ctx, R.color.white)); 
    textView.setTextColor(ContextCompat.getColor(ctx, R.color.primaryText)); 
    textView.setGravity(Gravity.CENTER); 
    /* 
    the adapter fills the number of elements based in the getCount 
    so either getCount returns value conditionally for an array of different size in getDropDownView 
    or the requisite value at position is hidden 
    */ 
    if(position == 0){ 
     textView.setVisibility(View.GONE); 
     textView.setHeight(0); 
    } 
    return textView; 
} 
} 

hata nedeni adaptör olup: genişlik ile Burada = 0DP

adaptördür. Bu spinner genişliği ise = 100dp hiçbir hata veriyor ve layout_weight nitelik şartının gibi kendisine layout_weight TextView değiştiricinin

+0

nullpointer çözüldü ?? ddFeet.setSelection (3); '. ddFeet.setSelection (2) için aynı sorun; '??? –

+0

evet. Bu hattı söylediğimde. Kodun geri kalanı "R.array.feet" – suku

+0

sonrası çalışır? –

cevap

2

programlama bir düzen grubunda TextView koyarak sorunu çözdük:

@Override 
public View getView(int position, View arg1, ViewGroup arg2){ 

    ... 

    // without this rtl the app crashes on lollipop devices with shawnlin number-picker 
    RelativeLayout rtlContainer = new RelativeLayout(mContext); 
    rtlContainer.addView(textView); 
    return rtlContainer; 
} 

Ayrıca ilginç, benim projeye this numberpicker kütüphanesini dahil sonrasında çökme meydana geldiği. Kütüphane ile kaza arasındaki uyumun ne olduğunu bilmiyorum, ama eğer bunu dışarda bırakırsam, kaza tekrar yok olur. Ayrıca, ilgili bir android issue buldum. Nedeni: TextView bir ViewGroup'a sarılmamış olduğundan, görünümle herhangi bir etkileşim, uygulamanın bir boş gösterici istisnasıyla çökmesine neden olur. TextView, bazı ViewGroup.LayoutParams ölçmeye çalışıyor.

+1

Teşekkürler. Sorunu bulmak için çok zaman geçirdim. Sadece bu bilgi, uygulamayı çökmesini konuyla ilgili sorunu çöz. Ama emin olmak için daha sonra Android (6, 7) ve 5'ten daha az test etmek gerekir. – Osify

+0

Android SDK 18'den SDK 23'e kadar test ettim 23 – bendaf

2

Seti android:layout_width="0dp" giyip vermek edildiğinde sadece hata veriyor. Bu Doğrusal Düzeni için ağırlığını kullanarak gibi çünkü bu olduğunu düşünüyorum

+0

İhtiyacım olan metni verdiğim bir sabit genişlik vermektir. Bu – suku

+0

hata veren spinner genişliğindedir ki 'layout_weight' bu şekilde çalışmıyor çünkü mümkün olduğunu sanmıyorum. Buradan bakın [link] (http://stackoverflow.com/a/3996044/5271656) –

+0

Layout_weight sadece kalan alanda değil, toplam alanda çalışır. Bu videoyu https://www.youtube.com/watch?v=rMksRBvYG28 adresinden ödeme yapabilirsiniz. – suku

0

olur ve ayrıca TextView'un

android:layout_width="80dp"

seti TextView'un genişliği 0DP genişliği ve kilo vermek ayarlayın.

android:layout_width="0dp"

android:layout_weight="0.25" //according to total weight

Tüm alt görünümler için tüm bu Doğrusal düzeni alt görüş ve ayrıca set genişlik 0DP için ayrı ağırlık vermek gerekiyor. yerine layout_weight bu sizin için çalışacaktır

Umut ... Çözüm olarak

+0

Kullanılabilir alanın% 25'i olacak şekilde genişliğe ihtiyacım var – suku

+0

Cevabımı güncelledim ... bunu dene –

+0

Denedim. Işe yaramadı. Sadece eğrileri ayrı bir lineer mizanpaja koymaya çalıştım ve sonra onlara ağırlık verdim ve bu da – suku

0

, ben percentrelativelayout kullandık. Kütüphane, build.gradle'daki bağımlılıklara compile 'com.android.support:percent:23.2.0' ekleyerek dahil edilebilir.

Nasıl kullanıyorum. Tam istediğim gibi çalışıyor. * Gereksiz xml özelliklerini kaldırdım.

<LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="horizontal"> 

     <TextView 
      android:layout_width="80dp" 
      android:layout_height="wrap_content" 
      android:text="@string/aprofile_height" /> 

     <android.support.percent.PercentRelativeLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content"> 

      <Spinner 
       android:id="@+id/aprofile_dd_feet" 
       app:layout_widthPercent="50%" 
       android:layout_height="wrap_content" /> 

      <Spinner 
       android:id="@+id/aprofile_dd_inches" 
       app:layout_widthPercent="50%" 
       android:layout_height="wrap_content" 
       android:layout_alignParentEnd="true" 
       android:layout_alignParentRight="true"/> 

     </android.support.percent.PercentRelativeLayout> 

    </LinearLayout> 
5
spin1.setSelection(0); //does not crash 
spin1.setSelection(getResources().getStringArray(R.array.feet).length - 1); 

değişiklik

spin1.setSelection(0, true); 
spin1.setSelection(getResources().getStringArray(R.array.feet).length - 1, true); 

için ben de bu soru vardı ve

+0

Bir açıklama yapabilir miyim? – suku

+0

Neden emin değilim, ancak bu Spinner ağırlığında iken sorunu giderir. Animate = true ayarlanarak, spinner tamamen çekilinceye kadar beklenebilir mi? SetEnabled true olduğunda – dleal

+0

bu soruna sahipti, ayrıca setEnabled ayarlanmışsa true değerine sahip olmak için setselection gerekiyor. – Mal