2015-05-27 61 views
6

我正在使用下面的代码自定义微调控件。 除了三星的Android 5.0设备外,大多数设备的一切正常。单击时,微调器应显示值的列表,但不会发生。

在仿真器和其他品牌的Android 5.0设备上工作正常。Android微调不适用于Android 5.0的三星设备

有没有人遇到过类似的问题,或者对可能发生什么有所了解?

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; 
} 


微调
enter image description here

示例结果预先
enter image description here

感谢。

+0

是微调打开它的列表中没有任何项目点击微调? –

+0

微调器有一个项目列表。它也在点击动画并且logcat显示以下内容: 'ViewPostImeInputStage ACTION_DOWN'。 但是没有任何反应。 – Raimundo

+0

它运行在除三星以外的其他运行棒棒糖的手机品牌上吗? – Olu

回答

7

我终于修好了!

Android的属性clickable设置为false,但在ComboBoxView.java文件在下面的代码执行的点击行为:

private final OnClickListener onClick = new OnClickListener() { 

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

这是工作无处不在(设备和仿真器),除了与三星设备Android 5.0。这我想不通为什么。


当我将cliclabke属性更改为true后,它开始工作。

android:clickable="true" 


感谢。

+0

删除android:clickable =“false”为我工作。不确定设置点击侦听器是否正确。 –

相关问题