顯示具有 Android 標籤的文章。 顯示所有文章
顯示具有 Android 標籤的文章。 顯示所有文章

2017年2月19日 星期日

Android-使用webService

因為專題要使用ASP.NET Web service
然後介面要有網頁單機跟APP
因為APP實在是太不熟悉惹
所以趕快來做個紀錄



這個完完全全只是練習連接的部分
所以包括web service的設計都只有兩種
一種是沒有傳值過去
一種是有傳值


一開始是新增專案...
好哦完全沒有難度
就這樣
然後我沒有選7.0的系統
因為聽說好像不是很好用





第一步呢
先下載一個叫做"Ksoap2"的東西
放到你專案的資料夾裡

然後回到你的專案
看到他了沒
看到之後就右鍵
選倒數第二個"Add as Library"




























然後問你要加到哪
我沒試過其他的有興趣可以試試

然後我的介面...

















我希望一打開會跑測試1
按完按鈕會跑測試2

然後程式來了
我習慣在開一個檔案放非主程式的部分啦
看你們喜歡














好了~一個空白的檔案
乾乾淨淨


[webConect.java]

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE;

public class webConect {
    /** 宣告連接 Web Service的基本資料*/
    private static final String NAMESPACE = "http://120.125.76.185/ECG_Webservice/" ;
    private static final String URL = " http://120.125.76.185/ECG/ECG_webservice.asmx";

    public String text1(){
/** 將EditText中的值傳給 Web Service*/
        SoapObject request = new SoapObject(NAMESPACE,"text1");
/** 設定呼叫 Web Service一些值*/
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.bodyOut=request;//envelope.setOutputSoapObject(request);//擇一使用
        HttpTransportSE androidHttpTransport = new HttpTransportSE( URL);
        androidHttpTransport.debug = true; // 測試模式使用
        try
        {
/** 開始呼叫 Web Service*/
            androidHttpTransport.call(NAMESPACE+"text1", envelope);
            // 获取返回的数据
            SoapObject object = (SoapObject) envelope.bodyIn;
            // 获取返回的结果
            String result = object.getProperty(0).toString();
            return result;
        }
        catch(Exception e) {
            return e.toString();
        }
    }
    public String text2(String SS){
/** 將值傳給 Web Service*/
        SoapObject request = new SoapObject(NAMESPACE,"text2");
        request.addProperty("s",SS);
/** 設定呼叫 Web Service一些值*/
        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.bodyOut=request;
        envelope.setOutputSoapObject(request);
        HttpTransportSE androidHttpTransport = new HttpTransportSE( URL);
        androidHttpTransport.debug = true; // 測試模式使用
        try
        {
/** 開始呼叫 Web Service*/
            androidHttpTransport.call(NAMESPACE+"text2", envelope);
            // 获取返回的数据
            SoapObject object = (SoapObject) envelope.bodyIn;
            // 获取返回的结果
            String result = object.getProperty(0).toString();
            // 将WebService返回的结果显示在TextView中
            return result;
        }
        catch(Exception e) {
            //e.printStackTrace();
            return e.toString();
        }
    }
}



主要連接就這樣喔
再來就是超級討厭害我找很久不知道哪裡錯的地方了
第一個是權限問題
這個檔案打開來














然後加上一行
<uses-permission android:name="android.permission.INTERNET" />

位子在這邊
這個就過關了

然後還有一個
執行緒的問題
主頁程式裡面使用webConect
要用Thread來跑
不然不能用
Thread thread = new Thread(){
        public void run(){
            txt1.setText(wc.text1());
        }
    };

要執行的地方就加上thread.start();



基本上先到這邊好了
不過還有些小問題還沒解決
就之後找到了再補上囉

2017年1月31日 星期二

迷你備忘錄練習-Android

Android設計真的是說難好像也還好
說簡單好像又不是那麼簡單

這個小範例包括:
1. ListView選項動態控制
2. 跨頁面傳值
主要是這兩個
至於監聽我在C#好像很少用到這個概念?(還是其實有哈哈哈學藝不精)
反正也是做個小小記錄
因為前面練習監聽設計的範例有點簡單哈哈哈(單純不想打開專案)

然後這個範例
不 能 存 檔 !!!
而且只有六格
所以基本上關掉備忘錄就不見拉
沒有實際用途



開始先拉畫面嚕沒什麼難度


介紹一下
Android的畫面是XML寫的
activity_main.xml就是畫面排版阿樣式設計阿放的地方
MainActivity,java是主程式的檔案
string.xml是放一些activity_main.xml會用到的文字或陣列
像是標題 "迷你備忘錄" 就是放在那裏
檔案大概的位置這樣



















重點一來拉~
我要來做ListView選項動態控制

我的ListView的id是LV_tatle //這個是在activity_main.xml設定
然後程式的部分 //被馬掉的部分代表還沒介紹到先打的

來喔文字檔一一介紹:(綠字是自己要打的,黃字是打完會產生的,紅字是講解)
public class MainActivity extends AppCompatActivity
implements AdapterView.OnItemClickListener,AdapterView.OnItemLongClickListener//你需要用到的監聽
{
    ListView LV; //新增一個物件
    String[] item; //我需要的項目字串陣列
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //
        LV=(ListView)findViewById(R.id.LV_tatle);//就...找到那個id...反正就那樣//這常用喔
        LV.setOnItemClickListener(this);//監聽按一下項目事件
        LV.setOnItemLongClickListener(this);//監聽長按項目事件
        item=new String[]{"1.","2.","3.","4.","5.","6."};//設定項目字串
        LV.setAdapter(new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,item));//用ArrayAdapter<String>來把陣列設定進ListView的項目裡
    }

    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        //按一下項目要做的事
    }

    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        return false;
        //長按項目要做的事
    }
}

好了
來整理一下
使用ListView可以用些什麼(只說程式要寫什麼,樣式不管我不會)
1. 先新增一個ListView物件,指向你介面的那個ListView
    ListView LV=(ListView)findViewById(R.id.LV_tatle);
2. 需要做監聽
    (1)implements AdapterView.OnItemClickListener,AdapterView.OnItemLongClickListener
    (2)LV.setOnItemClickListener(this);//監聽按一下項目事件
         LV.setOnItemLongClickListener(this);//監聽長按項目事件
3. 動態設定項目
    (1)要有一個陣列
    (2)要有一個ArrayAdapter<???(資料型別)> ArrayAdapter_=
     new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,你的陣列名稱)
    (3) LV.setAdapter(ArrayAdapter_);

好啦不難吧


再來做跨頁面傳值
先要新增一個頁面
就是按一下ListView的選項會跳到的編輯頁面






















然後就取名字
看心情高興改就改吧反正我是沒改





















再來介紹程式碼的部分:
先說簡單版的
就是第一頁有傳值給第二頁
可是第二頁沒有要回傳給第一頁的時候
在MainActivity,java//第一頁的程式
Intent It=new Intent(this, Main2Activity.class);
It.putExtra("item",1); //要傳的值是1的話,不一定要數字,字串也可
startActivity(It); //打開第二頁
在Main2Activity,java//第二頁的程式
 Intent It=getIntent(); //把自己打開(應該...吧
 note=It.getStringExtra("item"); //取得傳過來的值
finish(); //結束第二頁,回第一頁


這次要用的是要回傳的
反正就是會有多一個識別碼
然後多一個事件
至於識別碼跟事件的關聯還沒研究
之後了解了再做更新

在MainActivity,java//第一頁的程式
        It.putExtra("note",item[position]);
        startActivityForResult(It,position);//startActivity(It); 原本是這個,換一個加上識別碼的

    protected void onActivityResult(int requestCode,int resultCode,Intent it){
        if(resultCode==RESULT_OK){//如果回傳OK的話
            item[requestCode]=it.getStringExtra("note");
            AA.notifyDataSetChanged();//LV的Array更新陣列
        }
    }

在Main2Activity,java//第二頁的程式
        Intent It=getIntent(); //一樣打開自己
        note=It.getStringExtra("note");//取得傳來的值
        Intent it2=new Intent(); //要傳回去噠
        it2.putExtra("note",txv_id.getText()+" "+ET_note.getText()); //要傳回去的值
        setResult(RESULT_OK,it2); //如果確定要傳回去了,附加一個OK

        setResult(RESULT_CANCELED);//如果沒有值要回傳
        finish();


全部全部程式碼來嚕~
先上圖



















程式 文字檔:
MainActivity.java

package com.example.aa206.a0201_1;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity
implements AdapterView.OnItemClickListener,AdapterView.OnItemLongClickListener{
    ListView LV;
    Intent It;
    ArrayAdapter<String> AA;
    String[] item;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //
        It=new Intent(this, Main2Activity.class);
        LV=(ListView)findViewById(R.id.LV_menu);
        LV.setOnItemClickListener(this);
        LV.setOnItemLongClickListener(this);
        item=new String[]{"1.","2.","3.","4.","5.","6."};
        AA=new ArrayAdapter<String>(this,R.layout.support_simple_spinner_dropdown_item,item);
        LV.setAdapter(AA);
    }
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        It.putExtra("note",item[position]);
        startActivityForResult(It,position);
    }
    @Override
    public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
        item[position]=position+".";
        AA.notifyDataSetChanged();
        return false;
    }
    protected void onActivityResult(int requestCode,int resultCode,Intent it){
        if(resultCode==RESULT_OK){
            item[requestCode]=it.getStringExtra("note");
            AA.notifyDataSetChanged();
        }
    }
}

Main2Activity.java


package com.example.aa206.a0201_1;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

public class Main2Activity extends AppCompatActivity {
    TextView txv_id;
    EditText ET_note;
    int id;
    String note;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        //
        txv_id=(TextView)findViewById(R.id.txv_id);
        ET_note=(EditText)findViewById(R.id.eT_note);
        //
        Intent It=getIntent();
        note=It.getStringExtra("note");
        //
        txv_id.setText(note.substring(0,2));
        if(note.length()>3)
            ET_note.setText(note.substring(3));
    }
    public void onSave(View v){
        Intent it2=new Intent();
        it2.putExtra("note",txv_id.getText()+" "+ET_note.getText());
        setResult(RESULT_OK,it2);
        finish();
    }
    public void onCancel(View v){
        setResult(RESULT_CANCELED);
        finish();
    }

}