自定义微调不显示自定义对话框返回的值

问题描述:

我正在创建显示自定义对话框的自定义微调控件。为此,我创建了一个名为CustomSpinner的类,另一个名为CustomSpinnerDialog。自定义微调不显示自定义对话框返回的值

问题是,在微调控制器中,对话框中的选定值未打印。我知道该值正确返回,我已经用LogCat和Debug进行了检查。

而在我的自定义对话框中,我为onItemSelectedListener创建了一个接口,所以我的CustomSpinner类实现了此接口。代码如下。

在spinner xml文件中,我将它传递给它。它引用名为CustomSpinner以下类,即延伸的微调:

<com.myproject.CustomSpinner 
    android:id="@+id/customSpinner" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:paddingLeft="13dp" 
    android:prompt="@string/my_spinner"/> 

这里是CustomSpinner.java类:

public class CustomSpinner extends Spinner implements DialogInterface.OnClickListener, CustomSpinnerDialog.OnItemSelectedListener 
{ 

    public OnAddListener mListener = null; 
    public Context mContext; 
    public String[] mDataList; 
    public SpinnerAdapter mAdapter = null; 


    public interface OnAddListener 
    { 
     void onAdd(Spinner inSpinner); 
    } 

    public CustomSpinner(Context context, String[] dataList) 
    { 
     super(context); 
     this.mContext = context; 
     this.mDataList = dataList; 
    } 

    public CustomSpinner(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     this.mContext = context; 
    } 

    public void setDataList(String[] dataList) 
    { 
     this.mDataList = dataList; 
    } 

    @Override 
    public boolean performClick() 
    { 
     boolean handled = false; 
     if (!handled) 
     { 
      handled = true;             

      mAdapter = new SpinnerAdapter(mContext, R.id.spinnerItemText, mDataList); 
      CustomSpinnerDialog dialog = new CustomSpinnerDialog(mContext, mAdapter, this);    
      dialog.setOnItemSelectedListener(this); 
      dialog.setDialogTitle("My custom Dialog");     
      dialog.show(); 
     }   
     return handled; 
    } 

    @Override 
    public void onClick(DialogInterface dialog, int which) 
    { 
     if(which == DialogInterface.BUTTON_POSITIVE) 
     { 
      if(mListener!=null) 
       mListener.onAdd(this); 
     } 
     else 
     { 
      setSelection(which); 
     } 
     dialog.dismiss(); 
    } 

    public class SpinnerAdapter extends ArrayAdapter<String> 
    { 
     public Context mContext; 

     public SpinnerAdapter(Context context, int textViewResourceId, String[] objects) 
     { 
      super(context, textViewResourceId, objects); 
      this.mContext = context;    
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) 
     {   
      LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View view = inflater.inflate(R.layout.spinnerdialogitem, null); 
      TextView item = (TextView) view.findViewById(R.id.spinnerItemText); 
      String text = mDataList[position]; 
      item.setText(text); 
      return view; 
     } 
    } 

    @Override 
    public void onItemSelected(String itemValue) 
    {  
     int position = mAdapter.getPosition(itemValue); 
     this.setSelection(3); 
    } 
} 

这里是CustomSpinnerDialog.java类:

public class CustomSpinnerDialog extends Dialog implements OnItemClickListener, View.OnClickListener 
{ 
    private OnItemSelectedListener onItemSelectedListener; 

    public DialogInterface.OnClickListener mListener; 
    public Context mContext;  

    public interface OnItemSelectedListener 
    { 
     public void onItemSelected(String itemValue);  
    } 

    public CustomSpinnerDialog(Context context, CustomSpinner.SpinnerAdapter spinnerAdapter, DialogInterface.OnClickListener listener) 
    { 
     super(context);  
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     this.setContentView(R.layout.custom_spinner); 
     mListener = listener; 
     mContext = context; 

     ListView listView = (ListView) this.findViewById(R.id.listview); 
     listView.setAdapter(spinnerAdapter); 
     listView.setOnItemClickListener(this); 
     listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);   
    } 

    public void setOnItemSelectedListener(OnItemSelectedListener listener) 
    { 
     this.onItemSelectedListener = listener; 
    } 

    @Override 
    public void onClick(View v) 
    { 
     if(mListener != null) 
      mListener.onClick(this, DialogInterface.BUTTON_POSITIVE);   
    } 

    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
    { 
     if(mListener != null) 
      mListener.onClick(this, position); 
     String text = (String) parent.getItemAtPosition(position); 
     onItemSelectedListener.onItemSelected(text);   
    } 

    public void setDialogTitle(String title) 
    { 
     TextView titleText = (TextView) this.findViewById(R.id.titleText); 
     titleText.setText(title); 
    } 
} 

那么,微调是在这样一个活动开始:

cSpinner= (CustomSpinner) findViewById(R.id.customSpinner);  
cSpinner.setDataList(dataList); 
cSpinner.setTag("CustomSpinner"); 
cSpinner.setOnItemSelectedListener(controller); 

我试过didnt解决:

在类CustomSpinner的方法onItemSelected(String itemValue),我已经试过:

this.setPrompt(itemValue); // Didnt solve 

int position = mAdapter.getPosition(itemValue);//Didnt solve 
this.setSelection(itemValue); 

而且我知道,这个值正确返回。

在此先感谢。

我只是删除了CustomSpinner类中声明的适配器类,也删除了此构造函数:

public CustomSpinner(Context context, String[] dataList) 
{ 
    super(context); 
    this.mContext = context; 
    this.mDataList = dataList; 
} 

,而不是创建这样的微调和:

cSpinner= (CustomSpinner) findViewById(R.id.customSpinner);  
cSpinner.setDataList(dataList); 
cSpinner.setTag("CustomSpinner"); 
cSpinner.setOnItemSelectedListener(controller); 

我创造这样的:

cSpinner = (CustomSpinner)findViewById(R.id.customSpinner); 
     ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.options_array, R.layout.spinner_target);  
     cSpinner .setAdapter(adapter); 
     cSpinner .setTag("CustomSpinner"); 
     cSpinner .setOnItemSelectedListener(controller); 

而spinner_target.xml作为最后一个参数传递给th e createFromResource()方法是一个简单的xml文件,它只有一个TextView:

<?xml version="1.0" encoding="utf-8"?> 
<TextView 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/spinnerTarget" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:ellipsize="end" 
    android:padding="8dp"/>