繁体   English   中英

按钮onclick不适用于我的第二个片段android

[英]Button onclick not working with my second fragment android

我正在为计算器编写代码,分别具有两个fragmenOne和fragmentTwo片段。 FragmentOne是我的默认片段,它包含基本功能,例如加,减和数字。第二个片段fragmentTwo包含高级功能,例如sin tan cos ...等。我第二个片段中的按钮不起作用,并且不附加Editbox。 但是我fragmentOne中的按钮可以正常工作。 如果我转到fragmentTwo frist,然后转到fragmentOne,则按钮在fragmentOne中也不起作用。 请关注此特定问题。下面提供了代码和图像。

fragmentOne

fragmentTwo

MainActivity.java

package com.example.fragmentstest;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import de.congrace.exp4j.Calculable;
import de.congrace.exp4j.ExpressionBuilder;
import de.congrace.exp4j.UnknownFunctionException;
import de.congrace.exp4j.UnparsableExpressionException;

public class MainActivity extends Activity implements View.OnClickListener {
Button one, two, three, four, five, six, seven, eight, nine, zero, add,
sub, mul, div, equal, decimal, cancel, sin, cos, tan, open_bracket, close_bracket;
EditText disp;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    one = (Button) findViewById(R.id.one);
    two = (Button) findViewById(R.id.two);
    three = (Button) findViewById(R.id.three);
    four = (Button) findViewById(R.id.four);
    five = (Button) findViewById(R.id.five);
    six = (Button) findViewById(R.id.six);
    seven = (Button) findViewById(R.id.seven);
    eight = (Button) findViewById(R.id.eight);
    nine = (Button) findViewById(R.id.nine);
    zero = (Button) findViewById(R.id.zero);

    add = (Button) findViewById(R.id.add);
    sub = (Button) findViewById(R.id.sub);
    mul = (Button) findViewById(R.id.mul);
    div = (Button) findViewById(R.id.div);
    equal = (Button) findViewById(R.id.equal);
    decimal = (Button) findViewById(R.id.decimal);

    sin = (Button) findViewById(R.id.sin);
    cos = (Button) findViewById(R.id.cos);
    tan = (Button) findViewById(R.id.tan);
    open_bracket = (Button) findViewById(R.id.open_bracket);
    close_bracket = (Button)findViewById(R.id.close_bracket);

    disp = (EditText) findViewById(R.id.display_panel);
    cancel = (Button) findViewById(R.id.cancel); 
    try {
        one.setOnClickListener(this);
        two.setOnClickListener(this);
        three.setOnClickListener(this);
        four.setOnClickListener(this);
        five.setOnClickListener(this);
        six.setOnClickListener(this);
        seven.setOnClickListener(this);
        eight.setOnClickListener(this);
        nine.setOnClickListener(this);
        zero.setOnClickListener(this);

        add.setOnClickListener(this);
        sub.setOnClickListener(this);
        mul.setOnClickListener(this);
        div.setOnClickListener(this);
        equal.setOnClickListener(this);
        decimal.setOnClickListener(this);
        cancel.setOnClickListener(this);
        sin.setOnClickListener(this);
        cos.setOnClickListener(this);
        tan.setOnClickListener(this);
        open_bracket.setOnClickListener(this);
        close_bracket.setOnClickListener(this);
    } catch (Exception e) {
    }
}

public void selectFrag(View view) {
    Fragment fr;

    if (view == findViewById(R.id.button2)) {
        fr = new FragmentTwo();

    } else {
        fr = new FragmentOne();

    }

    FragmentManager fm = getFragmentManager();
    FragmentTransaction fragmentTransaction = fm.beginTransaction();
    fragmentTransaction.replace(R.id.fragment_place, fr);
    fragmentTransaction.commit();

}

@Override
public void onClick(View v) {
    Editable str = disp.getText();
    switch (v.getId()) {
    case R.id.zero:
        str = str.append(zero.getText());
        disp.setText(str);
        break;
    case R.id.one:
        str = str.append(one.getText());
        disp.setText(str);
        break;
    case R.id.two:
        str = str.append(two.getText());
        disp.setText(str);
        break;
    case R.id.three:
        str = str.append(three.getText());
        disp.setText(str);
        break;
    case R.id.four:
        str = str.append(four.getText());
        disp.setText(str);
        break;
    case R.id.five:
        str = str.append(five.getText());
        disp.setText(str);
        break;
    case R.id.six:
        str = str.append(six.getText());
        disp.setText(str);
        break;
    case R.id.seven:
        str = str.append(seven.getText());
        disp.setText(str);
        break;
    case R.id.eight:
        str = str.append(eight.getText());
        disp.setText(str);
        break;
    case R.id.nine:
        str = str.append(nine.getText());
        disp.setText(str);
        break;
    case R.id.add:
        str = str.append(add.getText());
        disp.setText(str);
        break;
    case R.id.sub:
        str = str.append(sub.getText());
        disp.setText(str);
        break;
    case R.id.mul:
        str = str.append(mul.getText());
        disp.setText(str);
        break;
    case R.id.div:
        str = str.append(div.getText());
        disp.setText(str);
        break;
    case R.id.decimal:
        str = str.append(decimal.getText());
        disp.setText(str);
        break;
    case R.id.sin:
        str = str.append(sin.getText());
        disp.setText(str);
        break;
    case R.id.cos:
        str = str.append(cos.getText());
        disp.setText(str);
        break;
    case R.id.tan:
        str = str.append(tan.getText());
        disp.setText(str);
        break;  
    case R.id.open_bracket:
        str = str.append(open_bracket.getText());
        disp.setText(str);
        break;
    case R.id.close_bracket:
        str = str.append(close_bracket.getText());
        disp.setText(str);
        break;  
    case R.id.cancel:
        disp.setText("");
        disp.setHint("Perform Operation");
        break;  
    case R.id.equal:
        String val;
        val = disp.getText().toString();
        Calculable calc = null;
        try {
            Calculable result = new ExpressionBuilder(val).build();
            disp.setText(Double.toString(result.calculate()));
            /* size_num = result.calculate(); */
        } catch (UnknownFunctionException e) {
            disp.setText("ERROR");
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (UnparsableExpressionException e) {
            disp.setText("ERROR");
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        break;

}

}
}

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<EditText 
   android:id="@+id/display_panel"
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:hint="@string/dispHint"/> 
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<Button
    android:id="@+id/button1"
    style="?android:attr/buttonBarButtonStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="selectFrag"
    android:paddingRight="45dp"
    android:text="@string/basic" />

<Button
    android:id="@+id/button2"
    style="?android:attr/buttonBarButtonStyle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="selectFrag"
    android:paddingLeft="25dp"
    android:paddingRight="25dp"
    android:text="@string/adv" />

</LinearLayout>
<fragment
    android:id="@+id/fragment_place"
    android:name="com.example.fragmentstest.FragmentOne"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

</LinearLayout>

fragment_two.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffff00"
android:orientation="vertical" >

 <Button
    android:id="@+id/sin"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/sin" />

 <Button
     android:id="@+id/cos"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignParentTop="true"
     android:layout_toRightOf="@+id/sin"
     android:text="@string/cos" />

 <Button
     android:id="@+id/tan"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignParentTop="true"
     android:layout_toRightOf="@+id/cos"
     android:text="@string/tan" />

 <Button
     android:id="@+id/log"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignBaseline="@+id/In"
     android:layout_alignBottom="@+id/In"
     android:layout_toRightOf="@+id/In"
     android:text="@string/log" />

 <Button
     android:id="@+id/not"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignBaseline="@+id/log"
     android:layout_alignBottom="@+id/log"
     android:layout_toRightOf="@+id/log"
     android:text="@string/not" />

 <Button
     android:id="@+id/close_bracket"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignBaseline="@+id/open_bracket"
     android:layout_alignBottom="@+id/open_bracket"
     android:layout_toRightOf="@+id/open_bracket"
     android:text="@string/close_bracket" />

 <Button
     android:id="@+id/open_bracket"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignBaseline="@+id/squareroot"
     android:layout_alignBottom="@+id/squareroot"
     android:layout_toLeftOf="@+id/not"
     android:text="@string/open_bracket" />

 <Button
     android:id="@+id/In"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_below="@+id/sin"
     android:layout_toLeftOf="@+id/cos"
     android:text="@string/In" />

 <Button
     android:id="@+id/squareroot"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_below="@+id/log"
     android:layout_toLeftOf="@+id/open_bracket"
     android:text="@string/squareroot" />

</RelativeLayout>

fragment_one.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00ffff"
android:orientation="vertical" >

<Button
    android:id="@+id/seven"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/seven" />

<Button
    android:id="@+id/nine"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@+id/eight"
    android:text="@string/nine" />

<Button
    android:id="@+id/div"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@+id/nine"
    android:text="@string/div" />

<Button
    android:id="@+id/eight"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_above="@+id/four"
    android:layout_toRightOf="@+id/seven"
    android:text="@string/eight" />

<Button
    android:id="@+id/five"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/four"
    android:layout_alignBottom="@+id/four"
    android:layout_toRightOf="@+id/four"
    android:text="@string/five" />

<Button
    android:id="@+id/six"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/five"
    android:layout_toRightOf="@+id/five"
    android:text="@string/six" />

<Button
    android:id="@+id/mul"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/six"
    android:layout_toRightOf="@+id/six"
    android:text="@string/mul" />

<Button
    android:id="@+id/two"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/one"
    android:layout_toRightOf="@+id/one"
    android:text="@string/two" />

<Button
    android:id="@+id/three"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/six"
    android:layout_alignTop="@+id/two"
    android:text="@string/three" />

<Button
    android:id="@+id/sub"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/three"
    android:layout_toRightOf="@+id/three"
    android:text="@string/sub" />

<Button
    android:id="@+id/decimal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/one"
    android:text="@string/decimal" />

<Button
    android:id="@+id/zero"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/decimal"
    android:layout_toRightOf="@+id/decimal"
    android:text="@string/zero" />

<Button
    android:id="@+id/equal"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/two"
    android:layout_toRightOf="@+id/two"
    android:text="@string/equal" />

<Button
    android:id="@+id/add"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignTop="@+id/equal"
    android:layout_toRightOf="@+id/equal"
    android:text="@string/add" />

<Button
    android:id="@+id/one"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/five"
    android:layout_toLeftOf="@+id/five"
    android:text="@string/one" />

<Button
    android:id="@+id/four"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_below="@+id/seven"
    android:text="@string/four" />

<Button
    android:id="@+id/cancel"
    android:layout_width="50dp"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/add"
    android:layout_alignParentTop="true"
    android:layout_toRightOf="@+id/div"
    android:text="@string/cancel" />

</RelativeLayout>

FragmentTwo.java

package com.example.fragmentstest;

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;


public class FragmentTwo extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater,
  ViewGroup container, Bundle savedInstanceState) {

  // Inflate the layout for this fragment

  return inflater.inflate(
          R.layout.fragment_two, container, false);
 }
}

FragmentOne.java代码与FragmentTwo.java相同,除了类名称为FragmentOne且位于'R.layout.fragment_one'中。

当您创建“活动”并且对activity_main.xml进行了膨胀时,它将仅包含fragment_one.xml中的视图。 目前,fragment_two.xml的视图将不存在(因为Fragment将在运行时动态添加)。 这意味着findViewById(R.id.sin)将在onCreate函数中返回null,并且现在可以通过视图注册onClickListener。 这就是为什么在注册ClickListener时需要try catch块的原因(以避免NullPointerExceptions)。

您应该在Fragments类而不是Activity中注册onClickListeners。 尝试从Activity类中删除setOnClickListener调用,然后在活动中执行此操作。

public class FragmentTwo extends Fragment{
@Override
   public View onCreateView(LayoutInflater inflater,
  ViewGroup container, Bundle savedInstanceState) {    
  // Inflate the layout for this fragment    
  View view = inflater.inflate(
          R.layout.fragment_two, container, false);
  Button sin =  (Button) view.findViewById(R.id.sin);
  sin.setOnClickListener(...);
  //other onItemListeners go here
  return view;
 }
}

您可以通过调用getActivity从Fragment类访问MainActivity,并将其转换为MainActivity

((MainActivity)getActivity())

Ashoka尝试此代码将对您有所帮助。在这里,我正在共享主要的Activity,fragment one,fragment两个类代码,基本上,我们在片段中使用按钮,因此最好处理片段中的事件并更新您的edittext使用处理程序在这样的主要活动中

主要活动课

public class MainActivity extends Activity  {
EditText disp;
static Handler mHandler;
String str ;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    disp = (EditText) findViewById(R.id.display_panel);
    str = disp.getText().toString();


    mHandler = new Handler()
    {
        public void handleMessage(android.os.Message msg) 
        {

            super.handleMessage(msg);
            if (msg.what == 1)
            {
                str = str + "seven";
            }
            else 
            {
                str = str + "sin";
            }
            disp.setText(str);

        }
    };
}

public void selectFrag(View view) {
    Fragment fr = null;

        if (view == findViewById(R.id.button2))
        {
            fr = new FragmentTwo();
            FragmentManager fm = getFragmentManager();
            FragmentTransaction fragmentTransaction = fm.beginTransaction();
            fragmentTransaction.replace(R.id.fragment_place, fr);
            fragmentTransaction.addToBackStack(null);

            fragmentTransaction.commit();
        } 
        else
        {
            fr = new FragmentOne();
            FragmentManager fm = getFragmentManager();
            FragmentTransaction fragmentTransaction = fm.beginTransaction();
            fragmentTransaction.replace(R.id.fragment_place, fr);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
        }



}

}

片段一类

  // Inflate the layout for this fragment

    View v = inflater.inflate(R.layout.fragment_one, container, false);

    Button seven = (Button)v.findViewById(R.id.seven);
    seven.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Message msgtab=MainActivity.mHandler.obtainMessage();
            msgtab.what= 1;
            MainActivity.mHandler.sendMessage(msgtab);

        }
    });


  return v;

和片段二类

View v = inflater.inflate(R.layout.fragment_two, container, false);
    Button sin = (Button)v.findViewById(R.id.sin);
    sin.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Message msgtab=MainActivity.mHandler.obtainMessage();
            msgtab.what=2;
            MainActivity.mHandler.sendMessage(msgtab);

        }
    });
    return v;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM