Как получить кнопку для запуска функции во фрагменте?

У меня есть фрагмент, и я хочу, чтобы кнопка запускала функцию Calculate(), когда я ее нажимаю. Мой фрагмент также основан на одном из шаблонов.

Я пробовал XML android:onClick, хотя я предполагаю, что он просматривает MainActivity вместо Fragment, поэтому он выдает ошибку. Я также пытался использовать OnClickListener из другого сообщения, хотя его настройка (как в коде внутри OnCreateCiew) приводила к ошибкам, хотя это может быть просто мое любительское знание того, как это работает.

Это моя функция вычисления (функция, которую я пытаюсь запустить при нажатии кнопки), которая находится внутри действия фрагмента:

    public void Calculate(View v) {
        EditText InitialVelocityInput = getView().findViewById(R.id.initialVelocityInput);
        EditText VelocityInput = getView().findViewById(R.id.velocityInput);
        EditText AccelerationInput = getView().findViewById(R.id.accelerationInput);
        EditText TimeInput = getView().findViewById(R.id.timeInput);

        Log.d("bing", "bing");
    }

При необходимости вот вся активность фрагмента

При использовании XML onclick мое приложение просто падает при нажатии кнопки. При использовании OnClickListener я даже не могу скомпилировать из-за ошибок. У меня нет большого опыта кодирования, чтобы знать, что делает код фрагмента шаблона, но я предполагаю, что он конфликтует с тем, как я настраиваю OnClickListener.

Вот как я пытался настроить свой OnClickListener:

    Button calculatebutton;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View kinematicsCalculatorView = inflater.inflate(R.layout.fragment_fragment_calculator_kinematics, container, false);
        calculatebutton = (Button) kinematicsCalculatorView.findViewById(R.id.calculateButton);
        calculatebutton.setOnClickListener(this);
        return kinematicsCalculatorView;
        // Inflate the layout for this fragment
       // return inflater.inflate(R.layout.fragment_fragment_calculator_kinematics, container, false);

    }


    public void onClick(View v) {
        EditText InitialVelocityInput = getView().findViewById(R.id.initialVelocityInput);
        EditText VelocityInput = getView().findViewById(R.id.velocityInput);
        EditText AccelerationInput = getView().findViewById(R.id.accelerationInput);
        EditText TimeInput = getView().findViewById(R.id.timeInput);

        Log.d("bing", "bing");
    }

Однако this в calculatebutton.setOnClickListener(this); отображается как ошибка (setOnClickListener(android.view.View.OnClickListener) in View cannot be applied to (com.example.myApp.FragmentCalculatorKinematics)). Метод onClick показан как никогда не используемый.

Эй, не могли бы вы показать нам, как вы его настраивали и какую именно ошибку вы получили?

Pabi Moloi 25.05.2019 22:16

@PabiMoloi Добавлена ​​дополнительная информация о onClickListener.

omnivore 26.05.2019 03:39

Вы можете реализовать обратные вызовы непосредственно в своем коде. Или вам нужно реализовать интерфейс View.OnClickListener для вашего основного класса фрагмента.

dipakbari4 26.05.2019 04:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
3
64
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Я нашел какое-то решение... Вместо того, чтобы помещать свой метод в FragmentActivity, я просто поместил его в MainActivity и установил android:OnClick="Calculate" в файле XML фрагмента. Хотя я не уверен, есть ли какие-либо последствия от этого.

Вам нужно внедрить View.OnClickListenerинтерфейс в свой fragment класс.

Вот фрагмент кода.

public class MyFragment extends Fragment implements View.OnClickListener{  // implements the View.OnClickListener interface here

Button calculatebutton;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View kinematicsCalculatorView = inflater.inflate(R.layout.fragment_fragment_calculator_kinematics, container, false);
    calculatebutton = (Button) kinematicsCalculatorView.findViewById(R.id.calculateButton);
    calculatebutton.setOnClickListener(this);
    return kinematicsCalculatorView;
    // Inflate the layout for this fragment
   // return inflater.inflate(R.layout.fragment_fragment_calculator_kinematics, container, false);

}


public void onClick(View v) {
    switch(v.getId()){  // getting the id of clicked item.
       case R.id.calculateButton:  // When the button will pressed.
         EditText InitialVelocityInput = getView().findViewById(R.id.initialVelocityInput);
        EditText VelocityInput = getView().findViewById(R.id.velocityInput);
        EditText AccelerationInput = getView().findViewById(R.id.accelerationInput);
        EditText TimeInput = getView().findViewById(R.id.timeInput);

        Log.d("bing", "bing");
        break;
    }
}}

Надеюсь, это сработает для вас.

Если вы добавили фрагмент в активность по XML: Из класса активности:

  • YourFragmentClass fragment = (YourFragmentClass)(yourActivity.getSupportFragmentManager().findFragmentById(fragment_id));.

Вы также можете найти фрагмент внутри активности по тегу (тег — это строка, которую вы назначаете фрагменту, когда вы автоматически добавляете фрагмент в активность).

  • YourFragmentClass fragment = (YourFragmentClass)(yourActivity.getSupportFragmentManager().findFragmentByTag(fragment_tag));.

После получения фрагмента теперь вы можете вызывать методы фрагмента из активности, установив OnClickListener для кнопки.

btn.setOnClickListener(new View.OnClickListener()
{
    @Override
    public void onClick(View v)
    {
       fragment.methodOfFragment();
    }
});

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