У меня есть фрагмент, и я хочу, чтобы кнопка запускала функцию 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 показан как никогда не используемый.
@PabiMoloi Добавлена дополнительная информация о onClickListener.
Вы можете реализовать обратные вызовы непосредственно в своем коде. Или вам нужно реализовать интерфейс View.OnClickListener
для вашего основного класса фрагмента.
Я нашел какое-то решение... Вместо того, чтобы помещать свой метод в 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();
}
});
Эй, не могли бы вы показать нам, как вы его настраивали и какую именно ошибку вы получили?