如何获得在片段中运行函数的按钮?

时间:2019-05-25 13:12:38

标签: java android onclick onclicklistener

我有一个片段,我希望按下按钮时可以运行Calculate()函数。我的片段也基于其中一个模板。

我已经尝试过XML android:onClick的东西,尽管我认为它是在MainActivity而不是Fragment中查找的,所以会引发错误。 我还尝试了另一篇文章中的OnClickListener,尽管对其进行设置(如在OnCreateCiew中的代码中)会出错,但是这可能只是我对它的工作原理的业余知识。

这是我的calculate函数(当我单击按钮时我试图运行的函数),它位于片段活动中:

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

如果需要,heres the whole fragment activity

使用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 :(得分:0)

我找到了某种解决方案... 我没有将我的方法放在FragmentActivity中,而是将其放入MainActivity中,并在片段的XML文件中设置了android:OnClick =“ Calculate”。尽管我不确定这样做是否会带来任何回想。

答案 1 :(得分:0)

您需要为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;
    }
}}

希望这对您有用。

答案 2 :(得分:0)

如果您通过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();
    }
});