【问题标题】:Radio Buttons: Listener in XML or JAVA?单选按钮:XML 或 JAVA 中的侦听器?
【发布时间】:2014-12-13 12:49:32
【问题描述】:

我决定为我的科学展览制作一个 android 应用程序,但我走到了死胡同!

我正在尝试使用单选按钮作为单位选择方法来制作单位转换器。
一切都很好,但是当我选择另一个单选按钮时,应用程序崩溃了!
我不知道发生了什么?

这是我的 XML 布局:

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/TableLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="30dp" >

<RadioGroup
    android:id="@+id/from"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="left" >

    <RadioButton
        android:id="@+id/km"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:onClick="radioClicked"
        android:text="KiloMeters" />

    <RadioButton
        android:id="@+id/m"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="radioClicked"
        android:text="Meters" />

    <RadioButton
        android:id="@+id/cm"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="radioClicked"
        android:text="Centimeters" />
</RadioGroup>

<Space
    android:id="@+id/Space1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="fill_vertical" />

<EditText
    android:id="@+id/KmValue"
    android:layout_width="115dp"
    android:layout_height="wrap_content"
    android:layout_marginBottom="24dp"
    android:layout_marginLeft="0dp"
    android:ems="10"
    android:inputType="numberDecimal" />

<RadioGroup
    android:id="@+id/to"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <RadioButton
        android:id="@+id/mTo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="38dp"
        android:checked="true"
        android:onClick="radioClicked"
        android:text="Meters" />

    <RadioButton
        android:id="@+id/cmTo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="radioClicked"
        android:text="Cenitmeters" />

    <RadioButton
        android:id="@+id/mmTo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="radioClicked"
        android:text="Millimeters" />
</RadioGroup>

<TextView
    android:id="@+id/MValue"
    android:layout_width="96dp"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceLarge" />

<Button
    android:id="@+id/cButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Convert" />

</TableLayout>

这是我的 Java 活动

import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.Toast;

public class LengthFragment extends Fragment {
    public LengthFragment(){}

    double ratio = 1000;
    int x=1;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_length, container, false);

        final EditText km = (EditText) rootView.findViewById(R.id.KmValue);
        final TextView meter = (TextView) rootView.findViewById(R.id.MValue);
        Button convert = (Button) rootView.findViewById(R.id.cButton);
        convert.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                if(km.getText().toString().isEmpty()) {
                    Toast.makeText(getActivity(), "Enter Something Buddy!", Toast.LENGTH_SHORT).show();
                } else {
                    float k = Float.parseFloat(km.getText().toString());
                    double m = k*ratio;
                    meter.setText(""+m);
                }
            }

        });
        return rootView;
    }

    public void radioClicked(View view) {
        boolean checked = ((RadioButton) view).isChecked();
        switch(view.getId()) {
            case R.id.km:
                if (checked)
                    x=1;
                break;
            case R.id.m:
                if (checked) {
                    x=2;
                }
                break;
            case R.id.cm:
                if (checked)
                    x=3;
                break;
            case R.id.mTo:
                if (checked)
                    if(x==1) {
                        ratio=1000;
                    }
                    else if(x==2) {
                        ratio=1;
                    }
                    else if(x==3) {
                        ratio=0.01;
                    } else {
                    }
                break;
            case R.id.cmTo:
                if (checked)
                    if(x==1) {
                        ratio=100000;
                    }
                    else if(x==2) {
                        ratio=100;
                    }
                    else if(x==3) {
                        ratio=1;
                    } else {
                    }
                break;
            case R.id.mmTo:
                if (checked)
                    if(x==1) {
                        ratio=1000000;
                    }
                    else if(x==2) {
                        ratio=1000;
                    }
                    else if(x==3) {
                        ratio=10;
                    } else {
                    }
                break;
        }
    }
}

我可以发布任何可能需要的答案。请帮忙!

【问题讨论】:

标签: java android xml eclipse android-fragments


【解决方案1】:

只需实现 RadioGroup setOnCheckedChangeListener ,而不是实现 OnClick 到 RadioButton :

RadioGroup from = (RadioGroup) rootView.findViewById(R.id.from);

from.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
    public void onCheckedChanged(RadioGroup arg0, int id) {
    if (id==R.id.km) {
        x=1;
    }else if(id==R.id.m){
        x=2;
    }else if(id==R.id.cm)
        x=3;
    }
});

同样将 setOnCheckedChangeListener 应用于 (to) RadioGroup 并从 xml 中移除 OnClick。

【讨论】:

    【解决方案2】:

    尝试为每个广播组添加不同的听众?不要仅仅依赖 onClickListener() 来获取 Button。

    尝试为每个无线电组设置一个setOnCheckedChangeListener ,例如

    RadioGroup rgFrom = (RadioGroup) rootView.findViewById(R.id.from);
    RadioGroup rgTo = (RadioGroup) rootView.findViewById(R.id.to);
    
    rgFrom.setOnCheckedChangeListener(...)
    rgTo.setOnCheckedChangeListener(...)
    


    当回调发生时,即onCheckedChanged,你可以更新你的变量'x' & 'ratio'

    public void onCheckedChanged(RadioGroup group, int checkedId)
    {
        switch(group.getId())
        {
            case R.id.from:
                // Do something to either 'x' or 'ratio'
                break;
            case R.id.to:
                // Do something to either 'x' or 'ratio'
                break;
        }
    }
    

    有关如何使用它的更多详细信息,请参阅提供的链接。

    当您的按钮被点击时,您可以轻松地进行计算/转换,而不必处理“x”或“比率”。

    Button convert = (Button) rootView.findViewById(R.id.cButton);
    convert.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // Do calculations/conversions based on the present state of the 2 radio groups
        }
    });
    

    【讨论】:

    • 我会尝试,但为什么要从 xml 中删除 OnClick 侦听器并使用 java 呢? XML 更简洁、更容易......?
    • 在您的 XML 中,所有内容都会触发 onClick 函数,这最终会使您的代码变得非常混乱。最好将功能分解成小部分,从长远来看,设计和调试肯定会容易得多,尤其是当您的程序变得更大时。
    猜你喜欢
    • 1970-01-01
    • 2011-07-16
    • 2023-03-27
    • 1970-01-01
    • 2015-07-31
    • 2020-12-23
    • 2018-12-26
    • 1970-01-01
    • 2012-11-11
    相关资源
    最近更新 更多