-2

ボタンを設定するための有効なテキストが editText4 に含まれていても、これを dateonset () メソッド内で行うことにより、この button.set() を複数の方法で試しました。edittext4が空であると思われるため、共有設定のルートを試しました。最後に、このメソッドを試して、ビューから Onclick メソッド内の Datebtn を初期化しました。ここではヌル ポインター例外は発生しませんが、スイッチ ケース内の Datebtn.setText() は、選択された日付値を settext しません & Datebtn テキストは、onCreateView () メソッドで設定された現在の日付のみを表示し続けます。些細なことを見逃していると思います。

public class AFragment extends Fragment implements OnClickListener {

    private DataManipulator dh;
    public Button           Datebtn;
    private Calendar        mCalen;
    private int             day;
    private int             month;
    private int             year;
    public String           myEditText4;

    @Override
    public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState ) {
        View view = inflater.inflate( R.layout.afragment, container, false );
        Button b1 = (Button)view.findViewById( R.id.Button01 );
        b1.setOnClickListener( this );
        Button Datebtn = (Button)view.findViewById( R.id.datepickerbutton );
        mCalen = Calendar.getInstance();
        day = mCalen.get( Calendar.DAY_OF_MONTH );
        month = mCalen.get( Calendar.MONTH );
        year = mCalen.get( Calendar.YEAR );
        Datebtn.setText( day + " / " + (month + 1) + " / " + year );
        myEditText4 = (String)Datebtn.getText();
        Datebtn.setOnClickListener( this );
        return view;
    }

    @SuppressLint( "CutPasteId" )
    @Override
    public void onClick( View view ) {
        Context context = view.getContext();
        Button Datebtn = (Button)view.findViewById( R.id.datepickerbutton );

        switch( view.getId() ) {
            case (R.id.datepickerbutton):
                DatePickerFragment newDateFragment = new DatePickerFragment();
                newDateFragment.setStyle( 1, 1 );
                newDateFragment.show( getFragmentManager(), "DatePicker" );
                Datebtn.setText( myEditText4 );
                break;

            case (R.id.Button01):
                View editText1 = (EditText)getView().findViewById( R.id.ppl );
                View editText2 = (EditText)getView().findViewById( R.id.litres );
                View editText3 = (EditText)getView().findViewById( R.id.odo );
                String myEditText1 = ((TextView)editText1).getText().toString();
                String myEditText2 = ((TextView)editText2).getText().toString();
                String myEditText3 = ((TextView)editText3).getText().toString();
                dh = new DataManipulator( context );
                if( myEditText1 != "" & myEditText2 != "" & myEditText3 != "" & myEditText4 != "" ) {
                    dh.insert( myEditText1, myEditText2, myEditText3, myEditText4 );
                    Toast.makeText( context.getApplicationContext(), "Submit Successful!!!", Toast.LENGTH_LONG ).show();
                    EditText text1 = (EditText)getView().findViewById( R.id.ppl );
                    text1.setText( "" );
                    EditText text2 = (EditText)getView().findViewById( R.id.litres );
                    text2.setText( "" );
                    EditText text3 = (EditText)getView().findViewById( R.id.odo );
                    text3.setText( "" );
                } else {
                    Toast.makeText( context.getApplicationContext(), "Values can not be empty!!!", Toast.LENGTH_LONG ).show();
                }
                break;
        }
    }

    @SuppressLint( "ValidFragment" )
    public class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

        @Override
        public Dialog onCreateDialog( Bundle savedInstanceState ) {
            final Calendar c = Calendar.getInstance();
            int year = c.get( Calendar.YEAR );
            int month = c.get( Calendar.MONTH );
            int day = c.get( Calendar.DAY_OF_MONTH );
            return new DatePickerDialog( getActivity(), this, year, month, day );
        }

        public void onDateSet( DatePicker view, int selectedYear, int selectedMonth, int selectedDay ) {
            int year = selectedYear;
            int month = selectedMonth;
            int day = selectedDay;
            myEditText4 = (day + " / " + (month + 1) + " / " + year);

            return;
        }
    }

}
4

1 に答える 1

0

すべての変数の状態をデバッグした後、問題を突き止めることができました。これが解決策です
1)onDateSetメソッド内でDatebtnを実行したとき、実際にはDatepickerビューからDatebtnオブジェクトを取得しようとしていました。Datebtn はこのフラグメントにないため、null ポインター例外が発生します
2) 次に、フラグメント マネージャー オブジェクトと findFragmentByTag("AFragment") を使用して、onDateSet 内から親フラグメントを取得しようとしました。AFragment レイアウト xml または AFragment クラスに対して「AFragment」タグが定義されていないため、これも null ポインターが返されます。
3) 次に、findFragmentByID (R.id.fragment_container) を使用して、フラグメント マネージャー オブジェクトから有効な AFragment オブジェクトを取得しようとしました。このステップで、DatePickerFragment クラスで有効な AFragment オブジェクト ハンドルを取得しました。その後、DatePickerFragment クラスの AFragment クラスの Datebtn で setText を実行できました

DatePickerFragment の onDateSet の作業コードは次のようになります。

    public void onDateSet(DatePicker view, int selectedYear,
            int selectedMonth, int selectedDay) {
        int year = selectedYear;
        int month = selectedMonth;
        int day = selectedDay;
        myEditText4 = (day + " / " + (month + 1) + " / " + year);
        FragmentManager fm = this.getFragmentManager();
        Fragment parFragment = fm.findFragmentById(R.id.fragment_container);
        Button dbtn = (Button) parFragment.getView().findViewById(R.id.datepickerbutton);
        dbtn.setText(myEditText4);
    return;
    }
于 2013-06-26T15:33:48.087 に答える