Как исправить попытку вызова виртуального метода 'android.view.View androidx.fragment.app.FragmentActivity.findViewById (int)' для пустой ссылки на объект? - PullRequest
0 голосов
/ 23 октября 2019

Я хочу установить дату в текстовом представлении после выбора даты, но она выдает ошибку в комментариях, которые я комментировал, как это исправить?

Здесь onCreateView

public class MoonFragment extends Fragment {
static {
    System.loadLibrary("native-lib");

}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

    View view = inflater.inflate(R.layout.activity_moon,
            container, false);
    final TextView moon_ra = (TextView) view.findViewById(R.id.moon_ra);
    Button button = (Button) view.findViewById(R.id.moon_btn);
    button.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            moon_ra.setText(Double.toString(Aries(0.2)));

        }
    });
    EditText moon_date = (EditText) view.findViewById(R.id.moon_date);
    moon_date.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v) {
            DialogFragment newFragment = new SelectDateFragment(); // It throws error here
            newFragment.show(getFragmentManager(), "DatePicker");
        }
    });
    return view;
   // return inflater.inflate(R.layout.activity_moon, container, false);
}

public native double Aries (double d);

Здесь я получил классдля выбора даты он выдает ошибку во второй строке

public static class SelectDateFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener {

    TextView moon_ra = (TextView)getActivity(). findViewById(R.id.moon_ra); // and here

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        final Calendar calendar = Calendar.getInstance();
        int yy = calendar.get(Calendar.YEAR);
        int mm = calendar.get(Calendar.MONTH);
        int dd = calendar.get(Calendar.DAY_OF_MONTH);
        return new DatePickerDialog(getActivity(), this, yy, mm, dd);
    }

    public void onDateSet(DatePicker view, int yy, int mm, int dd) {
        populateSetDate(yy, mm+1, dd);
    }

    public void populateSetDate(int year, int month, int day) {
        moon_ra.setText(month+"/"+day+"/"+year);
    }

}

} А может быть есть другой способ установить дату в textview?

Ответы [ 2 ]

0 голосов
/ 23 октября 2019

Вы можете использовать onActivityResult() для передачи данных из SelectDateFragment в MoonFragment, как показано ниже.

вызов SelectDateFragment внутри вашего MoonFragment, как показано ниже.

moon_date.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {
        DialogFragment newFragment = new SelectDateFragment();
        newFragment.setTargetFragment(this, 111); // add this line
        newFragment.show(getFragmentManager(), "DatePicker");
    }
});

отправьте данные из SelectDateFragment в MoonFragment, когда установлена ​​новая дата

 public void populateSetDate(int year, int month, int day) {
     String newDate = month+"/"+day+"/"+year;

     Intent intent = new Intent();
     intent.putStringExtra("date", newDate);
     getTargetFragment().onActivityResult(getTargetRequestCode(), 111, intent);
}

Для получения данных используйте onActivityResult в вашем MoonFragment

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == 111) {
        String newDate = data.getStringExtra("date");
        // here you can update your textview
         moon_ra.setText(newDate); // make sure your moon_ra textview is decleared globally
    }
}
0 голосов
/ 23 октября 2019

Очевидно, что #getActivity () имеет значение null до присоединения фрагмента.

Вам следует попытаться разместить код присвоения значения в методе #onCreateDialog ():

TextView moon_ra; 

@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    final Calendar calendar = Calendar.getInstance();
    int yy = calendar.get(Calendar.YEAR);
    int mm = calendar.get(Calendar.MONTH);
    int dd = calendar.get(Calendar.DAY_OF_MONTH);

    moon_ra = (TextView)getActivity().findViewById(R.id.moon_ra);

    return new DatePickerDialog(getActivity(), this, yy, mm, dd);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...