Ошибка: «Невозможно сделать статическую ссылку на нестатический метод findViewById (int) из типа Activity"

Я новичок в Java и пытаюсь создать активность с помощью EditText. При создании он загружается с текущей датой, и когда пользователь выбирает EditText, он отображает DatePicker. Когда пользователь выбирает дату, мне нужно поместить результат в EditText. Однако в настоящее время я получаю следующую ошибку:

Невозможно сделать статическую ссылку на нестатический метод findViewById (int) из типа Activity

Я знаю, что не могу статически ссылаться на нестатический метод. Я попытался удалить все статические ссылки, но это дало мне другие ошибки. Мой код ниже.

Можете ли вы помочь мне с некоторым примером кода, как я могу это сделать? Ошибка в том месте, где я пытаюсь поместить результат в EditText.

public class MainActivity extends Activity {

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

    //Get Current Date and assign to EditText Begin
    Calendar c = Calendar.getInstance();
    System.out.println("Current time => " + c.getTime());

    SimpleDateFormat df = new SimpleDateFormat("MM/dd/yyyy", Locale.US);
    String formattedDate = df.format(c.getTime());

    EditText ShowDate = (EditText) findViewById(R.id.editTextToShowDate);
    ShowDate.setText(formattedDate);
    //Get Current Date and assign to EditText End
}

//Date Picker Start
@TargetApi(Build.VERSION_CODES.HONEYCOMB) public void showDatePickerDialog(View v) {
    DialogFragment newFragment = new DatePickerFragment();
    newFragment.show(getFragmentManager(), "datePicker");
}    

@TargetApi(Build.VERSION_CODES.HONEYCOMB) public static class DatePickerFragment extends DialogFragment
implements DatePickerDialog.OnDateSetListener {

@TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Use the current date as the default date in the picker
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);

// Create a new instance of DatePickerDialog and return it
return new DatePickerDialog(getActivity(), this, year, month, day);
}

public void onDateSet(DatePicker view, int year, int month, int day) {
// Do something with the date chosen by the user
    String sToDate = createStringFromDateElements(year, month, day);
    EditText ShowDate = (EditText) findViewById(R.id.editTextToShowDate);  //I get the error here
    ShowDate.setText(sToDate);  
}

private String createStringFromDateElements(int year, int month, int day) {
   //TODO Auto-generated method stub
    return null;
}
}
//Date Picker End

@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_main, menu);
    return true;
}
}
8
nl ja de
Когда вы новичок в java, пожалуйста, потратьте некоторое время на понимание java, затем перейдите в android. Android - это надмножество java.
добавлено автор NewUser, источник
вам просто нужно сделать класс DatePickerFragment нестатичным, чтобы он включался в область экземпляра MainActivity.
добавлено автор njzk2, источник
внутренний класс не может быть нестационарным , что?
добавлено автор njzk2, источник
Попробуйте мой ответ, он будет работать
добавлено автор Pragnani, источник
Нет, не сохраняйте DatePickerFragment не статическим ... внутренний класс не может быть нестационарным ... Это приведет к принудительному закрытию приложения при изменении ориентации. Позвольте дескриптору android справиться с этим
добавлено автор Pragnani, источник
@ njzk2 проверить эту ссылку stackoverflow.com/questions/15044761/…
добавлено автор Pragnani, источник
@ user2105000 Мое решение будет работать, попробуйте
добавлено автор Pragnani, источник

2 ответы

Редактировать:

EditText ShowDate = (EditText)getActivity(). findViewById(R.id.editTextToShowDate);  

Это будет работать ...

14
добавлено
Почему это работает? В программе, которую я только что написал, я делаю статическую ссылку на findViewById в методе AsyncTask onPostExecute , который не приносит никакой ошибки. Но когда я пытаюсь вызвать его другим методом в той же программе, я получаю эту ошибку!
добавлено автор Solace, источник
Спасибо user1780366 - после того, как я включил ваше предложение, оно работает, но оно не возвращает дату, просто пустое. Я думаю, что элементы createtringfromdate не работают корректно. как я могу выбрать дату выбора? спасибо
добавлено автор user2105000, источник
нет, прочитайте quesiton. речь идет не о кастинге, а о сфере доступа к методу.
добавлено автор njzk2, источник
извините, читайте, чтобы поститься. действительно, ваш ответ правильный. (нужно было сделать пустое редактирование для undownvote/upvote)
добавлено автор njzk2, источник
@ njzk2 это не о кастинге. Он будет работать ... Попробуйте один раз, прежде чем давать downvote ... я получаю edittext с уровня активности, поэтому проблем не будет
добавлено автор Pragnani, источник
@ njzk2 без проблем друг ... спасибо
добавлено автор Pragnani, источник
@ njzk2 Я отредактировал свой ответ
добавлено автор Pragnani, источник
Это должно работать ......
добавлено автор user1780366, источник

Внутри класса Activity я сделал editText как статический и

EditText ShowDate = (EditText)this.findViewById(R.id.editTextToShowDate);

Это сработало для меня.

Для более здесь

0
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)