Я не могу использовать onClick в динамически создаваемых представлениях

Борюсь с этой ошибкой 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>
When I click on a dynamic view Что вы считаете «динамическим» видом? Каков ваш динамический взгляд?
blackapps 23.12.2020 11:48

В основной деятельности вы должны сначала использовать R.layout.news_edit_view для setContentView. Или иным образом переместите кнопку на R.layout.activity_main.

blackapps 23.12.2020 11:55

Не могли бы вы объяснить это более понятно, я уже добавил R.layout.news_edit_view в метод editNews().

doguzkaan 23.12.2020 13:40

Я восстановил значение идентификатора.

Arda Kazancı 23.12.2020 13:46
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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. Приложение даже не открывается :/

doguzkaan 23.12.2020 13:37

В чем ошибка? Я отредактировал ваш исходный код.

Arda Kazancı 23.12.2020 13:39

Попытка вызвать виртуальный метод «void android.widget.Button.setOnClickListener(android.view.View$O‌​nClickListener)» для нулевой ссылки на объект

doguzkaan 23.12.2020 13:42

для этого потребуется, чтобы макет был activity_main.xml, который, похоже, OP пытается получить доступ к представлениям из news_edit_view.xml.

A Honey Bustard 23.12.2020 16:14
Ответ принят как подходящий

вы устанавливаете родительский макет для своей деятельности в этой строке:

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);

в первую очередь. Просто убедитесь, что вы раздули правильный макет дочерних представлений, к которым вы хотите получить доступ.

Огромное спасибо за объяснение и решение моей проблемы, хорошего дня :)

doguzkaan 23.12.2020 17:13

Другие вопросы по теме