2012年4月30日 星期一

Failure delivering result ResultInfo問題原因


使用返回按鍵回上個Activity時遇到了以下錯誤。

Failure delivering result ResultInfo{who=android:fragment:2, request=0, result=0, data=null} to activity {etwarm.namespace/etwarm.buy.fragment.buy_home_main}: java.lang.NullPointerException

我們從錯誤訊息可以觀察到data=null所以錯誤了,那data在哪呢?其實就是返回的那個Activity有使用到onActivityResult,只要判斷一下data這個是否為空即可,如if(data!=null ),請參考以下。

 
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  //把勾選要自訂的物件回傳
  super.onActivityResult(requestCode, resultCode, data);
  if(data!=null ){
  if(requestCode == SELECT_OJ_CODE)
  {
   
   String select_oj_id=data.getStringExtra("SELECT_OJ");
   if(!select_oj_id.equals("")){
   Log.i("Tag", select_oj_id.toString());
   dao.update_want(table_name, test_tmp, select_oj_id);
   }  
  }
  }
 }

2012年4月25日 星期三

cannot be cast to android.widget.錯誤

今天很簡單的只是把checkbox調到textview的前面卻出現以下問題。

04-25 15:49:03.441: E/AndroidRuntime(15710): java.lang.ClassCastException: android.widget.TextView cannot be cast to android.widget.CheckBox


解決方式很令人意外的重新命名checkbox的id後又好了,真是奇怪。

2012年4月23日 星期一

JDOM搭配HttpClient Post

今天要把Android上的某字串以XML的方式POST給Server,使用了JDOM(要先下載\並匯入.jar檔)將訊息建立成XML格式後存入字串變數,再以Post的方式給Server,如以下:



package com.fff;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.output.XMLOutputter;




import android.app.Activity;
import android.os.Bundle;
import android.util.Log;


public class JOM_POST_Test1Activity extends Activity {
    /** Called when the activity is first created. */
 String aa="";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        try {
          BuildXMLDoc();
        } catch (Exception e) {
            e.printStackTrace();
        }
        
 
        final  String TAG = "ApacheHttpClientTest";
     String response = "";
     

      String url = "http://10.40.204.137:8080/project/test";
      
      List params = new ArrayList();
      params.add(new BasicNameValuePair("id",aa));
      params.add(new BasicNameValuePair("name","kuka"));
      try
      {
       response = httpPost(url, params);
      } catch (Exception e)
      {
       e.printStackTrace();
      }
      Log.i(TAG, "####"+response);
 
        
    }
    public void BuildXMLDoc() throws IOException, JDOMException {
     List list = new ArrayList();
     List list2 = new ArrayList();
     list.add(0, "1111111111"); list2.add(0, "11,22,33,44,55");
     list.add(1, "2222222222"); list2.add(1, "11,22,33,44,55");
     list.add(2, "3333333333"); list2.add(2, "11,22,33,44,55");
        Element root = new Element("list");
      
        
        Document Doc = new Document(root);
        
        Element elements;


       XMLOutputter outputter = new XMLOutputter();
      
        
          for(小於list容量時)
          {
           elements= new Element("user");
           elements.setAttribute("id", "" + i);
           elements.addContent(new Element("_id").setText(list.get(i)));
           elements.addContent(new Element("oj_want").setText(list2.get(i)));
           root.addContent(elements);
           aa+= outputter.outputString(elements);
          }  

          System.out.println(aa);
  
       /*   
      //如要產生XML的檔案使用以下   
      XMLOutputter XMLOut = new XMLOutputter();    
      XMLOut.output(Doc, new FileOutputStream("user.xml"));
 */
    }
    public String httpPost(String url, List params) throws Exception
 {
  String response = null;
  HttpClient httpclient = new DefaultHttpClient();
  
  HttpPost httppost = new HttpPost(url);
  try 
  {    
  
   httppost.setEntity(new UrlEncodedFormEntity(params,HTTP.UTF_8));
   
   HttpResponse httpResponse = httpclient.execute(httppost);
   int statusCode = httpResponse.getStatusLine().getStatusCode();
   if(statusCode==HttpStatus.SC_OK)
   {     
  
    response = EntityUtils.toString(httpResponse.getEntity());
   }
   else
   {
    response = "錯誤"+statusCode;
   }
  }catch (Exception e)
  {
   e.printStackTrace();
  }
  return response;
 }
}
 

2012年4月18日 星期三

使用addTextChangedListener偵測EditTex

今天想做個Edittext輸入自動搜尋,原本使用setOnKeyListener的時候,輸入中文都要再按一次完成才會即時才會擷取,結果發現addTextChangedListener更好用呢,一輸入就即時更新字串,跟WhatsApp的搜尋聯絡人一樣,很即時搜尋唷。





  
package comfff.fff;

import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class Test_setOnKeyActivity extends Activity {
/** Called when the activity is first created. */
    private EditText myEditText01;
    private TextView myTextView01;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main); 
   
    myEditText01 = (EditText)findViewById(R.id.EditText01);
    myTextView01 = (TextView)findViewById(R.id.TextView01);

   
    
    myEditText01.addTextChangedListener(new  TextWatcher() {

  @Override
  public void beforeTextChanged(CharSequence s, int start, int count,
    int after) {
   System.out.println("beforeTextChanged");
    
   
   
   // TODO Auto-generated method stub
   
  }

  @Override
  public void onTextChanged(CharSequence s, int start, int before,
    int count) {
   // TODO Auto-generated method stub
   System.out.println("onTextChanged");
   if(myEditText01.getText().length()==0)
   {
    myTextView01.setText("空白");
   }
   else{
   myTextView01.setText(myEditText01.getText());
   }
  }

  @Override
  public void afterTextChanged(Editable s) {
   // TODO Auto-generated method stub
   System.out.println("afterTextChanged");
   
  }
     
    });
    

  }
}

 

2012年4月16日 星期一

在Android 使用Sqlite注意事項

近來使用Sqlite時一直遇到很多挫折,所以將這些問題紀錄下來,防止下次出現相同錯誤。
  • 在Fragment中如果要傳入this(getActivity())這個參數時,一定要在onActivityCreated之後,不然一定出現 NullPointerException,這個問題很簡單卻困擾了我一天。
  • 如果在這個Activity中有使用到cursor,可以在最上層定義Cursor curosr=null,然後在Activity進入onPause() 時定義關閉,例如: if(cursor!=null){cursor.close();},然後在關閉db,例如: if(db!=null){db.close();}

2012年4月10日 星期二

檢查sqlite中某個資料表是否存在


有兩種方法,
第一種方法是:不需要知道表是否存在,在創建表的時候加上if not exists 例:create table if not exists myTable(...) ,這樣做的好處是,不需要知道表是否存在,只要每次都進行創建即可。因為裡面有判斷,如果表存在的時候,再執行這句不會發生重複創建表的情況。
第二種方法是:直接執行某個SQL語句,用try...catch來捕獲數據庫操作的異常。當異常表示數據庫表不存在的時候,再進行處理。例:
try{
Cursor c = getWritableDatabase().query("select * from myTable",null );
catch(Exception e) // 或者是 SQLiteException .
{//添加處理代碼,例如:創建表。
}
第二種的方法不如第一種好,原因是:第二種寫起來比較麻煩,還有,如果有其它異常的時候,需要對異常來進行判別,並處理。
PS:
上面的E文中有一種方法是判斷query的返回值 ,那個別想了,我在測試的時候,如果表被刪除了,一到那裡就崩潰,只能通過try...catch的方法。

2012年4月1日 星期日

從Fragment中取得main Activity中的值

今天遇到了一個狀況,就是Intent時傳遞了一個字串參數到了一個Fragment的main頁面,但是想要把這個intent過來的時傳遞到左側的fragment中,看書知道可以用callback看又覺得超困難,所以其實可以用一個很簡單的方法就是

假設現在的狀況是
1.fragment主畫面:buy_main
2.左側fragment:fragment_list
3.右側fragment:fragment_text

左側想取得main中的值可以宣告一個方法,如想取得bundle_msg_id值這個參數,以下

 public String get_bundle_msg()
 {
  return this.bundle_msg_id;
 }
然後在左側fragment:fragment_list中使用getActivity()取出main中的參數

String bundle_msg_id=((buy_main)getActivity()).get_bundle_msg();





星期、月份英文縮寫

中文 英文 3字母 縮寫 3字母 縮寫 2字母 縮寫 2字母 縮寫 1字母 縮寫 1字母 縮寫 其他 縮寫 星期日 Sunday SUN Sun SU Su S S 星期一 Monday MON Mon MO Mo M M 星期二 Tuesday TUE Tue TU ...