Борюсь с этой ошибкой 2 дня. Искал много вопросов, но ни один из них не решил мою проблему Когда я нажимаю на динамическое представление с onClick, появляется эта ошибка:
java.lang.IllegalStateException: не удалось найти метод Save(View) в родительском или предковом контексте для атрибута android:onClick, определенного в классе представления android.widget.Button с идентификатором "сохранить"
Даже если внутри метода пусто.
Это новостное приложение, и когда я нажимаю кнопку «Добавить», появляется окно редактирования, и я пишу новости, а затем нажимаю кнопку «Сохранить», после чего новости отображаются на главном экране. Но, как я уже сказал, когда я нажимаю на кнопку сохранения, он вылетает. Я полностью о onClick, но я ожидаю ваших идей :)
Основная деятельность
public class MainActivity extends AppCompatActivity {
TextView header;
TextView summary;
EditText editHeader;
EditText editSummary;
View news_edit;
Button saveButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
news_edit = findViewById(R.id.news_edit);
saveButton = findViewById(R.id.save);
header = findViewById(R.id.header);
summary = findViewById(R.id.summary);
editHeader = findViewById(R.id.editHeader);
editSummary = findViewById(R.id.editSummary);
}
public void Save(View view) {
LayoutInflater vi = null;
vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.news, null);
ViewGroup insertPoint = (ViewGroup) findViewById(R.id.allNews);
insertPoint.addView(v, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
}
public void editNews(View view) {
LayoutInflater vi = null;
vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.news_edit_view, null);
ViewGroup insertPoint = (ViewGroup) findViewById(R.id.linearLayout);
insertPoint.addView(v, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
}
news_edit_view
<GridLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:id = "@+id/news_edit"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:background = "@drawable/grey_background"
android:padding = "10dp">
<EditText
android:id = "@+id/editHeader"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_row = "0"
android:layout_column = "0"
android:ems = "10"
android:hint = "Başlık Yazınız"></EditText>
<EditText
android:id = "@+id/editSummary"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_row = "1"
android:layout_column = "0"
android:background = "@drawable/blue_backgrounda"
android:ems = "20"
android:gravity = "top|left"
android:hint = "Haber içeriğini buraya yazınız. Olabildiğince anlaşılabilir, kaynak belirterek ve yazım kurallarına uyarak yazmanız önemle rica olunur."
android:padding = "7dp" />
<Button
android:id = "@+id/save"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_row = "2"
android:layout_column = "0"
android:onClick = "Save"
android:text = "Save" />
</GridLayout>
В основной деятельности вы должны сначала использовать R.layout.news_edit_view для setContentView. Или иным образом переместите кнопку на R.layout.activity_main.
Не могли бы вы объяснить это более понятно, я уже добавил R.layout.news_edit_view в метод editNews().
Я восстановил значение идентификатора.




public class MainActivity extends AppCompatActivity {
TextView header;
TextView summary;
EditText editHeader;
EditText editSummary;
View news_edit;
Button saveButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
news_edit = findViewById(R.id.news_edit);
saveButton = findViewById(R.id.save);
header = findViewById(R.id.header);
summary = findViewById(R.id.summary);
editHeader = findViewById(R.id.editHeader);
editSummary = findViewById(R.id.editSummary);
saveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Save();
}
});
}
public void Save() {
LayoutInflater vi = null;
vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.news, null);
ViewGroup insertPoint = (ViewGroup) findViewById(R.id.allNews);
insertPoint.addView(v, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
}
public void editNews(View view) {
LayoutInflater vi = null;
vi = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = vi.inflate(R.layout.news_edit_view, null);
ViewGroup insertPoint = (ViewGroup) findViewById(R.id.linearLayout);
insertPoint.addView(v, 0, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT));
}
}
Макет
<GridLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:id = "@+id/news_edit"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:background = "@drawable/grey_background"
android:padding = "10dp">
<EditText
android:id = "@+id/editHeader"
android:layout_width = "wrap_content"
android:layout_height = "wrap_content"
android:layout_row = "0"
android:layout_column = "0"
android:ems = "10"
android:hint = "Başlık Yazınız"></EditText>
<EditText
android:id = "@+id/editSummary"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_row = "1"
android:layout_column = "0"
android:background = "@drawable/blue_backgrounda"
android:ems = "20"
android:gravity = "top|left"
android:hint = "Haber içeriğini buraya yazınız. Olabildiğince anlaşılabilir, kaynak belirterek ve yazım kurallarına uyarak yazmanız önemle rica olunur."
android:padding = "7dp" />
<Button
android:id = "@+id/save"
android:layout_width = "match_parent"
android:layout_height = "wrap_content"
android:layout_row = "2"
android:layout_column = "0"
android:text = "Save" />
</GridLayout>
Я скопировал их, но теперь это ошибка onClickListener. Приложение даже не открывается :/
В чем ошибка? Я отредактировал ваш исходный код.
Попытка вызвать виртуальный метод «void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)» для нулевой ссылки на объект
для этого потребуется, чтобы макет был activity_main.xml, который, похоже, OP пытается получить доступ к представлениям из news_edit_view.xml.
вы устанавливаете родительский макет для своей деятельности в этой строке:
setContentView(R.layout.activity_main);
хотя вы пытаетесь получить представления из
R.layout.news_edit_view
Вот почему эта строка (среди прочего):
saveButton = findViewById(R.id.save);
не может найти кнопку, потому что кнопка находится внутри макета news_edit_view, и он еще не раздут, и поэтому вы не можете установить OnClickListener, и он возвращает значение null.
Просто
<include layout = "@layout/news_edit_view"/>
добавленный в ваш файл activity_main.xml, может решить проблему, потому что ваш файл news_edit_view будет добавлен в ваш файл activity_main.xml.
Или, может быть, вы хотели:
setContentView(R.layout.news_edit_view);
в первую очередь. Просто убедитесь, что вы раздули правильный макет дочерних представлений, к которым вы хотите получить доступ.
Огромное спасибо за объяснение и решение моей проблемы, хорошего дня :)
When I click on a dynamic viewЧто вы считаете «динамическим» видом? Каков ваш динамический взгляд?