2014-12-13 41 views
0

我決定在Android上製作一個應用程序用於我的科學展覽,並且我已經到了死衚衕!單選按鈕:XML或JAVA中的監聽器?

我想做一個單位轉換器使用單選按鈕作爲單位選擇方法。
一切都很好,但當我選擇另一個單選按鈕,應用程序崩潰!
我不知道發生了什麼事?

這裏是我的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; 
     } 
    } 
} 

我可以張貼任何可能需要的答案。請幫忙!

+0

嘗試這個例子,然後嘗試你的代碼http://www.java2s.com/Code/Android/UI/RadioGroupselectionChangedListener.htm – 2014-12-13 13:03:49

回答

1

無需實現的OnClick以單選按鈕只實現RadioGroup中setOnCheckedChangeListener的:

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的(地)RadioGroup中與XML,請刪除onclick。

0

嘗試爲每個無線電組添加一個不同的監聽器?不要僅僅依靠onClickListener()作爲按鈕。

嘗試爲每個無線電組設置一個setOnCheckedChangeListener,例如,

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

rgFrom.setOnCheckedChangeListener(...) 
rgTo.setOnCheckedChangeListener(...) 


當回調製成,即onCheckedChanged,您可以更新變量「X」 &「比」

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 
    } 
}); 
+0

我會嘗試,但爲什麼從XML刪除的OnClick聽衆和使用java一? XML更簡潔,更簡單...? – Owais 2014-12-13 15:18:04

+0

在你的XML中,所有東西都會觸發'onClick'函數,這最終會讓你的代碼變得非常混亂。最好將功能分解爲小部分,從長遠來看,設計和調試的確更容易,特別是當程序變得更大時。 – Gosu 2014-12-14 05:53:54