2012年2月11日 星期六

[TQC+ Android] 2-2 公尺與英呎轉換 Use MenuInflater , onPrepareOptionsMenu





設計一個單位轉換程式 , 在輸入要轉換的數值後 , 按下轉換的按鈕 , 即可在下方顯示轉換後的數值 , 這題有幾個重點 , 關於menu元件的配置 , 不像所使用的方法: [TQC+ Android] 1-5 MENU 功能選單使用 menu.add來加入 , 取而代之的是我們使用res/menu資料夾所提供的menu.xml來配置 , 關鍵的method就是使用 MenuInflater這個類別來處理 , 而題目還提到要在menu出現前先判斷EditText內有沒有內容 , 沒有內容的話就把 menu選單的重設item invisible , 在這邊就要override Activity 下的 boolean onPrepareOptionsMenu (Menu menu) , 另外題目事先宣告了幾個變數 , 但是依照題意卻用不到....以下是程式碼。 


package COM.TQC.GDD02;
/*
題目說明:
英呎 = 公尺 * 3.28
公尺 = 英呎 * 0.3048
*/

import java.text.DecimalFormat;
import java.text.NumberFormat;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;


public class GDD02 extends Activity
{

 protected String PREF_M = "pref_m";
 protected String PREF_FT = "pref_ft";
 protected String pref_m;
 protected String pref_ft;
 
 EditText et;
 TextView tv; 
 Button etom , mtoe;
 NumberFormat NFTwoDigital;
 
 final int RESET = 0;
 
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        et = (EditText) this.findViewById(R.id.editText1);
        tv = (TextView) this.findViewById(R.id.result);
        etom = (Button) this.findViewById(R.id.etom);
        mtoe = (Button) this.findViewById(R.id.mtoe);
        
        etom.setOnClickListener(BOnClickListener);
        mtoe.setOnClickListener(BOnClickListener);         
       
        NFTwoDigital = new DecimalFormat(".00");       
    }
    
    Button.OnClickListener BOnClickListener = new Button.OnClickListener()
    {
  @Override
  public void onClick(View v)
  {
   // TODO Auto-generated method stub
   
   double inputNumber = Double.parseDouble((et.getText().toString()));        
   switch(v.getId())
   {
    case R.id.etom:
     tv.setText(inputNumber+"公尺="+NFTwoDigital.format(inputNumber * 3.28)+"英呎");
    break;
    
    case R.id.mtoe:
     tv.setText(inputNumber+"英呎="+NFTwoDigital.format(inputNumber * 0.3048)+"公尺");    
    break;
   }   
  }     
    };
    
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) 
    {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu, menu);
        
        return true;
    }
    
    @Override 
    public boolean onPrepareOptionsMenu (Menu menu)
    {
  if(et.getText().equals("")) menu.getItem(RESET).setVisible(false);
  else menu.getItem(RESET).setVisible(true);
     return true;     
    }
    
    @Override 
    public boolean onOptionsItemSelected(MenuItem item)
    {        
         ResetValue();
         item.setVisible(false);         
         return true;
    }
    
    private void ResetValue()
    {
     et.setText("");
     tv.setText("");
    } 

}


Layout檔
    
    
        
    
    
    
        


再來是 res/menu/menu.xml

    






P.S. 題目中所要求的Variable和Method皆會保留 , 也會根據題目所要求的流程去實作 , 縱使題目要求繞遠路....

2 則留言:

  1. HELLO DecimalFormat(".##") 這裡有錯喔,要改成DecimalFormat(".00")才會顯示小數點後二位 :)

    回覆刪除

Google Analytics