Android Fragment onClick按钮方法,应用程序停止工作

Android Fragment onClick按钮方法,应用程序停止工作,android,android-fragments,navigation-drawer,Android,Android Fragments,Navigation Drawer,您好,我有一个导航抽屉,它是我的主要活动(布局名为activity_main.xml)和一些片段,其中一个片段(命名为PrimaryFragment)中有一个计算器(布局名为peimary_layout.xml)问题是,当我运行应用程序并单击任何计算器按钮时,应用程序停止工作,并出现以下错误: 06-09 13:17:32.634 14244-14244/com.androidbelieve.drawerwithswipetabs E/AndroidRuntime: FATAL EXCEPTIO

您好,我有一个导航抽屉,它是我的主要活动(布局名为activity_main.xml)和一些片段,其中一个片段(命名为PrimaryFragment)中有一个计算器(布局名为peimary_layout.xml)问题是,当我运行应用程序并单击任何计算器按钮时,应用程序停止工作,并出现以下错误:

06-09 13:17:32.634 14244-14244/com.androidbelieve.drawerwithswipetabs E/AndroidRuntime: FATAL EXCEPTION: main
                                                                                    Process: com.androidbelieve.drawerwithswipetabs, PID: 14244
                                                                                    java.lang.IllegalStateException: Could not find method clickedBtn8(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.support.v7.widget.AppCompatButton with id 'eightBtn'
                                                                                        at android.view.View$DeclaredOnClickListener.resolveMethod(View.java:4767)
                                                                                        at android.view.View$DeclaredOnClickListener.onClick(View.java:4731)
                                                                                        at android.view.View.performClick(View.java:5697)
                                                                                        at android.widget.TextView.performClick(TextView.java:10815)
                                                                                        at android.view.View$PerformClick.run(View.java:22526)
                                                                                        at android.os.Handler.handleCallback(Handler.java:739)
                                                                                        at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                                        at android.os.Looper.loop(Looper.java:158)
                                                                                        at android.app.ActivityThread.main(ActivityThread.java:7229)
                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
这是包含计算器的我的片段:

public class PrimaryFragment extends Fragment  {

    public String str ="";
    Character op = 'q';
    double i,num,numtemp;
    EditText showResult;
    Button x2,x3;
@Nullable
    @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View v= inflater.inflate(R.layout.primary_layout,container,false);
    x2=(Button)v.findViewById (R.id.btnX2);
    x2.setText(Html.fromHtml(getResources().getString(R.string.X2)));
    showResult = (EditText)v.findViewById(R.id.display);
    return v;
}
    public void clickedBtn1(View v){
        insert("1");

    }

    public void clickedBtn2(View v){
        insert("2");

    }
    public void clickedBtn3(View v){
        insert("3");

    }
    public void clickedBtn4(View v){
        insert("4");

    }
    public void clickedBtn5(View v){
        insert("5");

    }
    public void clickedBtn6(View v){
        insert("6");
    }
    public void clickedBtn7(View v){
        insert("7");

    }
    public void clickedBtn8(View v){
        insert("8");

    }
    public void clickedBtn9(View v){
        insert("9");

    }
    public void clickedBtn0(View v){
        insert("0");

    }
    public void clickedBtndot(View v){
        insert(".");

    }


    public void clickedtan(View v){
        showResult.setText("tan");
        op='T';
      Toast.makeText(getActivity().getApplicationContext(),"tan",Toast.LENGTH_SHORT).show();

    }
    public void clickedSin(View v){
        showResult.setText("sin");
        op='S';
       Toast.makeText(getActivity().getApplicationContext(),"Sin",Toast.LENGTH_SHORT).show();

    }
    public void clickedCos(View v){
        showResult.setText("Cos");
        op='C';
        // Toast.makeText(getApplicationContext(),"Cos",Toast.LENGTH_SHORT).show();

    }
    public void clickedSqrt(View v){
        showResult.setText("√");
        op='√';
        //Toast.makeText(getApplicationContext(),"√",Toast.LENGTH_SHORT).show();

    }
    public void clickedBtnx2(View v){
        perform();
        op = 'X';

    }
    public void clickedBtnlog(View v){

        op = 'L';

    }

    public void clickedBtnplus(View v){
        perform();
        op = '+';

    }

    public void clickedMinus(View v){
        perform();
        op = '-';

    }
    public void clickedBtnDiv(View v){
        perform();
        op = '/';

    }
    public void clickedBtnMul(View v){
        perform();
        op = '*';

    }
    public void clickedBtnequal(View v){
        calculate();

    }

    public void clickedBtnClear(View v){
        reset();
    }


    private void reset() {
        // TODO Auto-generated method stub
        str ="";
        op ='q';
        num = 0;
        numtemp = 0;
        showResult.setText("");
    }
    public void insert(String j) {
        // TODO Auto-generated method stub

        str = str+j;

        num = Double.valueOf(str);

        showResult.setText(str);

    }
    private void perform() {
        // TODO Auto-generated method stub
        str = "";
        numtemp = num;
    }
    private void calculate() {
        // TODO Auto-generated method stub
        if(op == '+')
            num = numtemp+num;
        else if(op == '-')
            num = numtemp-num;
        else if(op == '/')
            num = numtemp/num;
        else if(op == '*')
            num = numtemp*num;
        else  if(op=='C')
        {
            perform();

            num=Math.cos(Math.toRadians(numtemp));

        }
        else  if(op=='S')
        {
            perform();

            num=Math.sin(Math.toRadians(numtemp));

        }
        else  if(op=='T')
        {
            perform();

            num=Math.tan(Math.toRadians(numtemp));

        }

        else  if(op=='√')
        {
            perform();

            num=Math.sqrt(numtemp);

        }
        else  if(op=='X')
        {
            num=numtemp*numtemp;

        }
        else  if(op=='L')
        {
            perform();
            num=Math.log(numtemp);

        }
        // showResult.setText("Cos(" + numtemp + ")");
        showResult.setText(String.valueOf(num).toString());
    }

}
这是我的主要活动

public class MainActivity extends AppCompatActivity{
DrawerLayout mDrawerLayout;
NavigationView mNavigationView;
FragmentManager mFragmentManager;
FragmentTransaction mFragmentTransaction;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    /**
     *Setup the DrawerLayout and NavigationView
     */

         mDrawerLayout = (DrawerLayout) findViewById(R.id.drawerLayout);
         mNavigationView = (NavigationView) findViewById(R.id.shitstuff) ;

    /**
     * Lets inflate the very first fragment
     * Here , we are inflating the TabFragment as the first Fragment
     */

         mFragmentManager = getSupportFragmentManager();
         mFragmentTransaction = mFragmentManager.beginTransaction();
         mFragmentTransaction.replace(R.id.containerView,new TabFragment()).commit();
    /**
     * Setup click events on the Navigation View Items.
     */

         mNavigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
         @Override
         public boolean onNavigationItemSelected(MenuItem menuItem) {
            mDrawerLayout.closeDrawers();



             if (menuItem.getItemId() == R.id.nav_item_sent) {
                 FragmentTransaction fragmentTransaction = mFragmentManager.beginTransaction();
                 fragmentTransaction.replace(R.id.containerView,new SentFragment()).commit();

             }

            if (menuItem.getItemId() == R.id.nav_item_inbox) {
                FragmentTransaction xfragmentTransaction = mFragmentManager.beginTransaction();
                xfragmentTransaction.replace(R.id.containerView,new TabFragment()).commit();
            }

             return false;
        }

    });

    /**
     * Setup Drawer Toggle of the Toolbar
     */

            android.support.v7.widget.Toolbar toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
            ActionBarDrawerToggle mDrawerToggle = new ActionBarDrawerToggle(this,mDrawerLayout, toolbar,R.string.app_name,
            R.string.app_name);

            mDrawerLayout.setDrawerListener(mDrawerToggle);
mDrawerToggle.syncState();

    }
}

请帮助,我该怎么办?

我猜您正在设置属性
android:onClick=“clickedBtn8”
。如果是这样的话,看看这个

您需要在活动中声明方法
public void clickedBtn8(视图v){…}
,而不是片段。如果您希望在用户单击按钮后在片段中执行某些操作,请从活动中调用片段方法,或向按钮添加onclicklistener,如下所示:

Button btn8 = (Button) v.findViewById(R.id.btn8); //or whatever your id is
btn8.setOnClickListener(this);
并让您的片段实现
View.OnClickListener
并实现此方法:

public void onClick(View v) {
  // do something when the button is clicked
}

您已经定义了android:onClickXML参数,但错过了一些步骤。
在这里阅读更多信息:

你在哪里为buton设置了
onClickListener
?你使用PrimaryFragments的类的Post代码我没有使用过,我是Android编程新手,你能帮我尝试一下吗,但我没能解决这个问题,你有没有办法在我的活动中添加代码并发送给我,或者我从电子邮件中向你发送项目并查看它?你是否删除了xml文件中的
android:onClick=“…”
?没有,为什么我要删除xml中的android:onClick=“…”?如果我删除了xml文件中每个按钮的onclick代码,那么我如何使用它们在文本字段中插入我想要的数字。你能给我发送电子邮件,这样我就可以向你发送项目并亲自查看它吗有两种方法为视图添加onclick侦听器:-定义
android:onclick=“yourMethod”
属性,并在活动(不是片段!)中实现
public void yourMethod(View v){…}
,或者-要在代码中添加onclicklistener-也可以在片段中执行此操作。如果你想,你可以发邮件,然后我会给你发邮件(我不想在这里发邮件;)