2

問題は、カスタムスピナーをクリックすると、カスタムダイアログがリストビューのラジオボタンと下部のボタンで表示されますが、デフォルトではアイテムが選択されておらず、選択した場合でも、SpinnerDialogのnullpointerexceptionが原因でアプリケーションがクラッシュすることです- > onItemClick-> onItemSelectedListener.onItemSelected(text)ここ
からサンプルコードを取得し、ダイアログの代わりにalertdialogを使用します

私の顧客スピナークラス

public class SpinnerCustomDialog extends Spinner implements DialogInterface.OnClickListener  {
protected OnAddListener mListener = null;

public SpinnerCustomDialog(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
}


public SpinnerCustomDialog(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    // TODO Auto-generated constructor stub
}

public SpinnerCustomDialog(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}

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


@Override
public boolean performClick() {
    //boolean handled = super.performClick(); //TODO how to avoid this skip ?

    boolean handled = false;
    if (!handled) {
        handled = true;
        Context context = getContext();

        Log.w(SpinnerCustomDialog.class.getName(), "checlk1");
        AccountDS datasource;
        datasource = new AccountDS(context);
        datasource.open();
        List<Accounts> values = datasource.getAllAccountList();
        Log.w(BalanceActivity.class.getName(), "List Size " + values.size());
        datasource.close();

        ArrayAdapter<Accounts> adapter = new ArrayAdapter<Accounts>(context, android.R.layout.simple_list_item_single_choice, values);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        //SpinnerDialog lDialog = new SpinnerDialog(context, getSelectedItemPosition(), adapter, this);
        SpinnerDialog lDialog = new SpinnerDialog(context, 1, adapter, this);
        lDialog.setTitle("select category");
        lDialog.show();
    }

    return handled;
}

@Override
public void onClick(DialogInterface dialog, int which) 
{
    Log.w(SpinnerCustomDialog.class.getName(), "onClick");
    setSelection(which);        
    dialog.dismiss();
}
}

カスタマースピナーダイアログコード

public class SpinnerDialog extends AlertDialog implements OnItemClickListener, View.OnClickListener {

DialogInterface.OnClickListener mListener;
View promptsView;
OnItemSelectedListener onItemSelectedListener;
public Context mContext; 

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

protected SpinnerDialog(Context context, int inPosition, ListAdapter inSpinnerAdapter, DialogInterface.OnClickListener inListener) {
    super(context);
    // TODO Auto-generated constructor stub
    //this.setContentView(com.abdulwasie.mybalance.R.layout.activity_spinner_dialog);
    promptsView = getLayoutInflater().inflate(R.layout.activity_spinner_dialog, null);
    this.setView(promptsView);
    mListener = inListener;
    mContext = context;
    Log.w(SpinnerDialog.class.getName(), "inside spinner dialog 1");        
    ListView lList = (ListView)promptsView.findViewById(R.id.listCategory);



    lList.setAdapter(inSpinnerAdapter);
    lList.setOnItemClickListener(this);
    lList.setChoiceMode(ListView.CHOICE_MODE_SINGLE );
    lList.setSelection(1);

    Log.w(SpinnerDialog.class.getName(), "inside spinner dialog 2");
    setButton(DialogInterface.BUTTON_POSITIVE, "Positive",
            new OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int which) {
                    // This is replaced later
                    Log.w(SpinnerDialog.class.getName(), "button clicked");

                }
            });
    Log.w(SpinnerDialog.class.getName(), "inside spinner dialog 3");

}


@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(SpinnerDialog.this, position);
    String text = parent.getItemAtPosition(position).toString();
    Log.w(SpinnerDialog.class.getName(), "onItemClick " + text);
    onItemSelectedListener.onItemSelected(text);        
}   
}

と私の活動クラス

public class RegisterActivity extends Activity  {
static final int DATE_DIALOG_ID = 1;
private int mYear;
private int mMonth;
private int mDay;
private EditText pickDate;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_register);

    pickDate = (EditText) findViewById(R.id.pickdate);

    pickDate.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_UP) {
                showDialog(DATE_DIALOG_ID);
            }
            return false;
        }
    });

    final Calendar c = Calendar.getInstance();
    mYear = c.get(Calendar.YEAR);
    mMonth = c.get(Calendar.MONTH);
    mDay = c.get(Calendar.DAY_OF_MONTH);
    updateDate();


    //SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    //String currentDateandTime = sdf.format(new Date());

    //pickDate.setText(mDay + "/" + mMonth + "/" + mYear);
    //pickDate.setText(currentDateandTime);


    AccountDS datasource;
    datasource = new AccountDS(this);
    datasource.open();

    List<Accounts> values = datasource.getAllAccountList();
    Log.w(BalanceActivity.class.getName(), "List Size " + values.size());

    datasource.close();

    ArrayAdapter<Accounts> adapter = new ArrayAdapter<Accounts>(this, android.R.layout.simple_list_item_1, values);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

    final Spinner my_spin=(Spinner)findViewById(R.id.spinner1);
    if (my_spin == null) {
        Log.w(BalanceActivity.class.getName(), "my spin is null ");
    }

    my_spin.setAdapter(adapter);


    SpinnerCustomDialog my_spin1 = (SpinnerCustomDialog)findViewById(R.id.spinner2);
    my_spin1.setOnItemSelectedListener(new OnItemSelectedListener() 
    {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
        {
            Log.w(RegisterActivity.class.getName(), "onItemSelected");

        }

        @Override
        public void onNothingSelected(AdapterView<?> parentView) 
        {

        }
    });

}

@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_register, menu);
    return true;
}

protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DATE_DIALOG_ID:
        Log.w(BalanceActivity.class.getName(), mDay + " - " + mMonth + " - " + mYear );
        return new DatePickerDialog(this, mDateSetListener, mYear, mMonth,
                mDay);
    }
    return null;
}

protected void onPrepareDialog(int id, Dialog dialog) {
    switch (id) {
    case DATE_DIALOG_ID:

        ((DatePickerDialog) dialog).updateDate(mYear, mMonth, mDay);
        break;
    }
}

private DatePickerDialog.OnDateSetListener mDateSetListener = new DatePickerDialog.OnDateSetListener() {

    public void onDateSet(DatePicker view, int year, int monthOfYear,
            int dayOfMonth) {
        mYear = year;
        mMonth = view.getMonth();
        mDay = dayOfMonth;
        Log.w(BalanceActivity.class.getName(), "onDateSet: " + mDay + " - " + mMonth + " - " + mYear );
        updateDate();
    }
};

private void updateDate() {
    try {


        pickDate.setText(
                new StringBuilder()
                // Month is 0 based so add 1
                .append(mDay).append("/")
                .append(mMonth + 1).append("/")
                .append(mYear));
    } catch (Exception ex) {

    }

}

}

と私の活動のレイアウト

<RelativeLayout 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:paddingTop="70dp"
tools:context=".RegisterActivity" >

<EditText
    android:id="@+id/pickdate"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentTop="true"
    android:clickable="true"
    android:cursorVisible="false"
    android:editable="false"
    android:ems="7"
    android:inputType="none"
    android:singleLine="true" />

<Spinner
    android:id="@+id/spinner1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/pickdate"
    android:layout_alignParentRight="true"
    android:layout_alignTop="@+id/pickdate"
    android:layout_toRightOf="@+id/pickdate"
    android:prompt="@+string/selectAccount"
    android:ems="5" />

<EditText
    android:id="@+id/editText2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentRight="true"
    android:layout_below="@+id/pickdate"
    android:ems="10" >
</EditText>

<com.abdulwasie.mybalance.SpinnerCustomDialog
    android:id="@+id/spinner2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/editText2"
    android:layout_toLeftOf="@+id/spinner1"
    android:prompt="@+string/hello_world" />

</RelativeLayout>

ログ:

12-08 09:11:04.278: E/AndroidRuntime(10993): FATAL EXCEPTION: main
12-08 09:11:04.278: E/AndroidRuntime(10993): java.lang.NullPointerException
12-08 09:11:04.278: E/AndroidRuntime(10993):    at com.abdulwasie.mybalance.SpinnerDialog.onItemClick(SpinnerDialog.java:74)
12-08 09:11:04.278: E/AndroidRuntime(10993):    at android.widget.AdapterView.performItemClick(AdapterView.java:284)
12-08 09:11:04.278: E/AndroidRuntime(10993):    at android.widget.ListView.performItemClick(ListView.java:3569)
12-08 09:11:04.278: E/AndroidRuntime(10993):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:1831)
12-08 09:11:04.278: E/AndroidRuntime(10993):    at android.os.Handler.handleCallback(Handler.java:587)
12-08 09:11:04.278: E/AndroidRuntime(10993):    at android.os.Handler.dispatchMessage(Handler.java:92)
12-08 09:11:04.278: E/AndroidRuntime(10993):    at android.os.Looper.loop(Looper.java:150)
12-08 09:11:04.278: E/AndroidRuntime(10993):    at android.app.ActivityThread.main(ActivityThread.java:4385)
12-08 09:11:04.278: E/AndroidRuntime(10993):    at java.lang.reflect.Method.invokeNative(Native Method)
12-08 09:11:04.278: E/AndroidRuntime(10993):    at java.lang.reflect.Method.invoke(Method.java:507)
12-08 09:11:04.278: E/AndroidRuntime(10993):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
12-08 09:11:04.278: E/AndroidRuntime(10993):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
12-08 09:11:04.278: E/AndroidRuntime(10993):    at dalvik.system.NativeStart.main(Native Method)
4

0 に答える 0