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

У меня есть фрагмент, и я хочу, чтобы кнопка запускала функцию 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 отображается как никогда не используемый.

Ответы [ 3 ]

0 голосов
/ 26 мая 2019

Вам необходимо реализовать 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;
    }
}}

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

0 голосов
/ 26 мая 2019

Если вы добавили фрагмент к активности по 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();
    }
});
0 голосов
/ 26 мая 2019

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

...