2015-05-27 37 views
6

Używam niestandardowego widgetu Spinner z poniższym kodem. Wszystko działa poprawnie na większości urządzeń, z wyjątkiem urządzeń Samsunga z Androidem 5.0. Po kliknięciu Spinner powinien wyświetlić listę wartości, ale tak się nie stanie.
Na emulatorach i innych urządzeniach marki z Androidem 5.0 działa dobrze.Android Spinner nie działa na urządzeniach Samsung z systemem Android 5.0

Czy ktoś napotkał podobną osobę lub ma pojęcie o tym, co może się wydarzyć?

xml

<?xml version="1.0" encoding="utf-8"?> 

<Spinner 
    android:id="@+id/_combo_spinner" 
    android:layout_width="0px" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:focusable="false" 
    android:background="@null" 
    android:clickable="false" 
    android:paddingBottom="@dimen/cell_text_section_text_padding_bottom" 
    android:paddingLeft="@dimen/cell_text_section_text_padding_left" 
    android:paddingRight="@dimen/cell_text_section_text_padding_right" 
    android:paddingTop="@dimen/cell_text_section_text_padding_top" 
    android:spinnerMode="dropdown" /> 

<View 
    android:layout_width="@dimen/drawable_stroke_width" 
    android:layout_height="match_parent" 
    android:layout_marginBottom="5dp" 
    android:layout_marginTop="3dp" 
    android:background="@color/stroke_dark_grey" 
    android:paddingBottom="@dimen/cell_text_section_text_padding_bottom" 
    android:paddingTop="@dimen/cell_text_section_text_padding_top" /> 

<ImageView 
    style="@style/image__default" 
    android:layout_width="20dp" 
    android:layout_height="20dp" 
    android:layout_gravity="center" 
    android:layout_marginLeft="@dimen/cell_text_section_text_padding_left" 
    android:layout_marginRight="@dimen/cell_text_section_text_padding_right" 
    android:src="@drawable/ic_action_expand" /> 

Java

public class ComboBoxView extends LinearLayout { 

private Spinner mSpinner; 
private OnItemSelectedListener mListener; 

public ComboBoxView(Context context) { 
    super(context); 
    initializeLayout(context); 
} 

public ComboBoxView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    initializeLayout(context); 
} 

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
public ComboBoxView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    initializeLayout(context); 
} 

@TargetApi(Build.VERSION_CODES.LOLLIPOP) 
public ComboBoxView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
    super(context, attrs, defStyleAttr, defStyleRes); 
    initializeLayout(context); 
} 

// Internal methods: 

/** 
* Initializes the layout 
* 
* @param context 
*/ 
private void initializeLayout(final Context context) { 

    mListener = null; 

    // Inflate and retrieve the views: 
    this.setOrientation(LinearLayout.VERTICAL); 
    LayoutInflater.from(context).inflate(R.layout.view_combo_box, this); 
    mSpinner = (Spinner) findViewById(R.id._combo_spinner); 

    // Finish initialization: 
    final int paddingTop = (int) getResources().getDimension(R.dimen.cell_text_section_text_padding_top); 
    final int paddingBottom = (int) getResources().getDimension(R.dimen.cell_text_section_text_padding_bottom); 
    final int paddingLeft = (int) getResources().getDimension(R.dimen.cell_text_section_text_padding_left); 
    final int paddingRight = (int) getResources().getDimension(R.dimen.cell_text_section_text_padding_right); 
    setOnClickListener(onClick); 
    setOrientation(LinearLayout.HORIZONTAL); 
    setBackgroundResource(R.drawable.button_primary); 
    setClickable(true); 
    setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    return true; 
} 

private final OnClickListener onClick = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     mSpinner.performClick(); 
    } 
}; 

@Override 
public void clearFocus() { 
    super.clearFocus(); 
    mSpinner.clearFocus(); 
} 

// External methods: 

/** 
* Interface definition for a callback to be invoked when 
* an item in this view has been selected (extracted from {@link AdapterView.OnItemSelectedListener}). 
*/ 
public interface OnItemSelectedListener { 

    /** 
    * <p>Callback method to be invoked when an item in this view has been 
    * selected. This callback is invoked only when the newly selected 
    * position is different from the previously selected position or if 
    * there was no selected item.</p> 
    * <p/> 
    * Impelmenters can call getItemAtPosition(position) if they need to access the 
    * data associated with the selected item. 
    * 
    * @param parent The ComboBoxView where the selection happened 
    * @param position The position of the view in the adapter 
    * @param id  The row id of the item that is selected 
    */ 
    void onItemSelected(ComboBoxView parent, int position, long id); 

    /** 
    * Callback method to be invoked when the selection disappears from this 
    * view. The selection can disappear for instance when touch is activated 
    * or when the adapter becomes empty. 
    * 
    * @param parent The ComboBoxView that now contains no selected item. 
    */ 
    void onNothingSelected(ComboBoxView parent); 
} 

public void setValuesAsString(final List<String> newValues) { 
    setValuesAsString(newValues, 0); 
} 

public void setValuesAsString(final List<String> newValues, int initialValue) { 

    List<CharSequence> result = new ArrayList<CharSequence>(newValues.size()); 
    for(String value : newValues) { 
     result.add(value); 
    } 
    setValues(result, initialValue); 
} 

public void setValues(final List<CharSequence> newValues) { 
    setValues(newValues, 0); 
} 

public void setValues(final List<CharSequence> newValues, int initialValue) { 

    if((initialValue >= newValues.size()) || (initialValue < -1)) { 
     IllegalArgumentException ex = new IllegalArgumentException("Invalid value for initialValue"); 
     LOG.error(LOG.SOURCE.UI, "Invalid",ex); 
     throw ex; 
    } 

    // Prepare the list of elements: 
    // NOTE: The last item in ComboBoxArrayAdapter must be empty. Items should also contain the 
    // same number of lines as the "tallest" entry: 
    final List<CharSequence> finalValues = new ArrayList<CharSequence>(newValues.size()); 
    finalValues.addAll(newValues); 

    int maxLines = 1; 
    for(CharSequence text : newValues) { 
     final String[] lines = text.toString().split("\r\n|\r|\n"); 
     maxLines = Math.max(maxLines, lines.length); 
    } 
    finalValues.add(""); 

    // Prepare spinner: 
    final ComboBoxArrayAdapter adapter = new ComboBoxArrayAdapter(this.getContext(), R.layout.view_combo_box_item, finalValues); 
    adapter.setDropDownViewResource(R.layout.view_combo_box_item_dropdown); 
    adapter.setMaxLines(maxLines); 
    mSpinner.setOnItemSelectedListener(null); 
    mSpinner.setAdapter(adapter); 
    mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 

     boolean firstSelection = true; 

     @Override 
     public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
      if (mListener != null) { 
       int index = (position >= (mSpinner.getCount() - 1)) ? -1 : position; 
       mListener.onItemSelected(ComboBoxView.this, index, id); 
      } 
     } 

     @Override 
     public void onNothingSelected(AdapterView<?> parent) { 
      if (mListener != null) { 
       mListener.onNothingSelected(ComboBoxView.this); 
      } 
     } 
    }); 

    if (mListener != null) { 
     mListener.onNothingSelected(this); 
    } 

    // Set initial selection: 
    if(initialValue != -1) { 
     mSpinner.setSelection(initialValue); 
    } else { 
     mSpinner.setSelection(newValues.size()); 
    } 
} 


public void setOnItemSelectedListener(final OnItemSelectedListener listener) { 
    mListener = listener; 
} 


public int getSelectedItem() { 
    int result = mSpinner.getSelectedItemPosition(); 
    if(result >= mSpinner.getCount()) { 
     result = -1; 
    } 

    return result; 
} 


Spinner
enter image description here

Przykładowy wynik
enter image description here

Z góry dzięki.

+0

to spinner otwierający swoją listę bez elementów w nim po kliknięciu na pokrętło? –

+0

Spinner ma listę przedmiotów. Animuje się również po kliknięciu, a logcat wyświetla: 'ViewPostImeInputStage ACTION_DOWN'. Ale wtedy nic się nie dzieje. – Raimundo

+0

Czy działa na innych marek telefonów z systemem Lollipop innych niż Samsung? – Olu

Odpowiedz

7

W końcu to naprawiłem!

Nieruchomość android clickable została ustawiona false, ale zachowanie kliknięcie przeprowadzono w pliku ComboBoxView.java na poniższym kodzie:

private final OnClickListener onClick = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     mSpinner.performClick(); 
    } 
}; 

to działa wszędzie (urządzenia i emulatory) z wyjątkiem urządzeń Samsung z Android 5.0. To nie mogłem zrozumieć dlaczego.


Po zmianie właściwości cliclabke na true, zaczęło działać.

android:clickable="true" 


Dzięki.

+0

usuwanie Androida: clickable = "false" działało dla mnie. Nie jestem pewien, czy ustawienie odbiornika kliknięcia jest poprawne. –