編輯:關於Android編程
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
android:layout_height="wrap_content"
android:text="請輸入圖片的路徑" />
android:id="@+id/et_path"
android:hint="請輸入圖片的路徑"
/>
android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="viewImage" //點擊事件對應在Actitvty類中的方法 android:text="浏覽" /> android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/iv" android:src="@drawable/ic_launcher" android:scaleType="centerInside" /> 2、在DemoActivity類中的: public class DemoActivityextends Activity { private EditText et_path;//圖片地址的輸入框 private ImageView iv;//顯示圖片的組件 @Override public void onCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); et_path = (EditText) this.findViewById(R.id.et_path); iv = (ImageView)this.findViewById(R.id.iv); } //點擊按鈕響應方法: public void viewImage(View view){ Stringpath = et_path.getText().toString().trim();//路徑 if(TextUtils.isEmpty(path)){ Toast.makeText(this, "路徑不能為空",Toast.LENGTH_SHORT).show(); return; }else{ // 模擬浏覽器 http的get請求 獲取圖片數據 並展現到界面上 try { URL url = new URL(path); //url不合法的異常 HttpURLConnection conn= (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); // 網絡超時的異常 //服務器返回回來的狀態碼 int code =conn.getResponseCode(); if(code == 200){ //獲取響應數據的長度 String length = conn.getContentLength()+""; //響應數據的類型 String type = conn.getContentType(); // 獲取服務器返回過來的流的信息 InputStream is = conn.getInputStream(); //將流轉成bitMap對象 Bitmap bitmap =BitmapFactory.decodeStream(is); //io 異常 //將bitMap設置給ImageView iv.setImageBitmap(bitmap); }else { Toast.makeText(this, "圖片的不存在,或者服務器異常",Toast.LENGTH_SHORT).show(); } } catch (Exception e) { e.printStackTrace(); //Toast.makeText(this, "訪問圖片出錯", Toast.LENGTH_SHORT).show(); if(e instanceofMalformedURLException){ Toast.makeText(this, "url不合法", Toast.LENGTH_SHORT).show(); }else if(e instanceofSocketTimeoutException){ Toast.makeText(this, "網絡連接超時", Toast.LENGTH_SHORT).show(); }else if(e instanceofIOException){ Toast.makeText(this, "照片數據錯誤", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this, "未知錯誤", Toast.LENGTH_SHORT).show(); } 3、由於連接服務器要產生流量:所以連接服務器需要權限:在AndroidManifest.xml中。 二、網絡html的查看器: 1、設置布局: android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical"> android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="請輸入網頁的路徑" /> android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/et_path" android:text="http://192.168.1.247:8080/web/index.jsp" android:hint="請輸入網頁的路徑" /> android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="viewHtml" android:text="查看" /> //時,就會出現側拉條。 android:layout_width="match_parent" android:layout_height="match_parent"> android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/tv" /> 2、業務代碼:點擊按鈕觸發的方法: public void viewHtml(Viewview) { String path =et_path.getText().toString().trim(); if("".equals(path)) { Toast.makeText(this, "路徑不能為空", 0).show(); return; } else { try { //創建url對象 URL url = new URL(path); try { HttpURLConnection conn = (HttpURLConnection) url .openConnection(); conn.setRequestMethod("GET"); //可以不寫 conn.setConnectTimeout(5000); int code = conn.getResponseCode(); if(code == 200){ InputStream is =conn.getInputStream(); try { //將輸入流轉成字節數組. byte[] result = StreamTools.getBytes(is); tv.setText(new String(result)); } catch (Exception e) { Toast.makeText(this, "io錯誤", 0).show(); e.printStackTrace(); } } } catch (IOException e){ Toast.makeText(this, "協議不支持,io錯誤", 0).show(); e.printStackTrace(); } } catch (MalformedURLException e) { Toast.makeText(this,"url不合法", 0).show(); e.printStackTrace(); } 3、設定連接網絡的權限: 三、在客戶端顯示視頻列表: 1、設置布局: 使用ListView:顯示視頻播放列表: ①、在layout/main.xml中。定義ListView android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" >//豎直 android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/lv" /> ②、設置listView中每個項目要顯示的布局:layout/item.xml中 android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#449f9f9f" //設置項目的背景色 android:orientation="horizontal">//水平 android:id="@+id/iv_item_icon" android:layout_width="wrap_content" android:layout_height="48dip" android:src="@drawable/default1" /> android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:orientation="vertical" >//豎直 android:id="@+id/tv_item_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="標題" /> android:id="@+id/tv_item_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="播放時間" android:textColor="@color/green" />//顯示字體的顏色 android:id="@+id/tv_item_count" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="點播次數" android:textColor="@color/green" /> 2、業務代碼.從服務器端獲取的是xml文件 先將xml文件轉成channel對象的集合. ①、DemoActivity 中組件的顯示設置 public class DemoActivity extends Activity { private ListView lv private ChannelService service; private List<Channel>channels; private LayoutInflater inflater; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); lv = (ListView) this.findViewById(R.id.lv);//獲取列表 //獲取布局填充器 inflater = LayoutInflater.from(this); //創建服務類的對象 service = new ChannelService(this); //調用service層的方法將服務端獲取的xml轉成channel對象的list集合 channels = service.getChannels(); //為listView設置中項目之間的分隔線顏色的高度 lv.setDivider(new ColorDrawable(Color.WHITE)); lv.setDividerHeight(1);//高度 //為ListView設置適配器 lv.setAdapter(new MyAdapter()); //listView的點擊項目事件 lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterViewparent, View view, int position, long id) { //同id獲取listView中項目 Channel channel = (Channel) lv.getItemAtPosition(position); String title =channel.getTitle(); System.out.println("播放"+ title+"提交請求給服務器,通知播放次數加1"); } }); } //自定義的適配器類,將浏覽過的圖片保存到sd卡上,下次再浏覽就直接浏覽sd卡上的 private class MyAdapter extends BaseAdapter { @Override public int getCount() { return channels.size(); } @Override public Object getItem(int position) { // TODO Auto-generated methodstub return channels.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated methodstub return position; } @Override public View getView(int position, ViewconvertView, ViewGroup parent) { /* * TextView tv = newTextView(DemoActivity.this); * tv.setText(channels.get(position).getTitle()); */ Channel channel = channels.get(position); //通過布局填充器將layout下的item.xml轉成view對象 View view = inflater.inflate(R.layout.item,null); //分別獲取item.xml文件中定義的組件 TextView tv_count = (TextView)view.findViewById(R.id.tv_item_count); TextView tv_time= (TextView) view.findViewById(R.id.tv_item_time); TextView tv_title = (TextView) view.findViewById(R.id.tv_item_title); //為組件設置值 tv_count.setText("點播次數:" + channel.getCount()); tv_time.setText("播放時間:" + channel.getTime()); tv_title.setText(channel.getTitle()); //獲取imageView對象 ImageView iv = (ImageView)view.findViewById(R.id.iv_item_icon); String iconpath =channel.getIconpath(); // 判斷, 判斷sd卡上是否有這個圖片文件存在 如果有的話 使用sd卡的圖片 // 如果沒有 才去下載這個圖片 String iconname =getIconName(iconpath); //將圖片封裝成對象 File file = new File(Environment.getExternalStorageDirectory(), iconname); if (file.exists()) {//判斷sd卡上是否存在圖片 System.out.println("使用sd卡的緩存圖片"); iv.setImageURI(Uri.fromFile(file)); } else { //通過地址獲取圖片 URL url = new URL(iconpath); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); if(conn.getResponseCode()==200){ InputStream is = conn.getInputStream(); Bitmap bitmap = BitmapFactory.decodeStream(is); } if (bitmap != null) {//判斷從服務器端獲取的圖片是否存在 iv.setImageBitmap(bitmap);//為imageView設置圖片 // 需要把圖片保存在sd卡裡面 // format 圖片的格式 FileOutputStreamstream; try { stream = new FileOutputStream(file); System.out.println("使用的是下載的圖片"); // 數據會被寫到sd卡的file對象裡面 bitmap.compress(CompressFormat.JPEG, 100, stream); } catch (FileNotFoundException e) { e.printStackTrace(); } }// 如果為空 顯示默認的圖片 } return view; } } /** * 獲取一個圖片路徑對應的圖片名字 * * @param path * @return */ private String getIconName(Stringpath) { int start = path.lastIndexOf("/"); return path.substring(start + 1); } } ②將服務端獲取的xml轉成channel對象的list集合 public class ChannelService { private Context context; public ChannelService(Contextcontext) { this.context = context; } public ListgetChannels() throws Exception { //請求服務端 String path =context.getResources().getString(R.string.serverurl); URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("GET"); conn.setConnectTimeout(5000); if( conn.getResponseCode()==200){ //獲取的輸入流 InputStream is = conn.getInputStream(); //1. 得到xml的解析器 XmlPullParser parser = Xml.newPullParser(); //2. 初始化解析器 parser.setInput(is,"utf-8"); int type =parser.getEventType(); Listchannles = new ArrayList(); Channel channel = null; while(type!=XmlPullParser.END_DOCUMENT){ switch (type) { case XmlPullParser.START_TAG: if("channel".equals(parser.getName())){ channel = new Channel(); }elseif("title".equals(parser.getName())){ channel.setTitle(parser.nextText()); } else if("time".equals(parser.getName())){ channel.setTime(parser.nextText()); } elseif("count".equals(parser.getName())){ channel.setCount(Integer.parseInt( parser.nextText())); } elseif("iconpath".equals(parser.getName())){ channel.setIconpath(parser.nextText()); } break; case XmlPullParser.END_TAG: if("channel".equals(parser.getName())){ channles.add(channel); channel = null; } break; } type = parser.next(); } return channels; } return null; } } ③、服務端的xml文件
android:layout_width="wrap_content"
android:onClick="viewImage" //點擊事件對應在Actitvty類中的方法
android:text="浏覽"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/iv"
android:src="@drawable/ic_launcher"
android:scaleType="centerInside"
public class DemoActivityextends Activity {
private EditText et_path;//圖片地址的輸入框
private ImageView iv;//顯示圖片的組件
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et_path = (EditText) this.findViewById(R.id.et_path);
iv = (ImageView)this.findViewById(R.id.iv);
}
//點擊按鈕響應方法:
public void viewImage(View view){
Stringpath = et_path.getText().toString().trim();//路徑
if(TextUtils.isEmpty(path)){
Toast.makeText(this, "路徑不能為空",Toast.LENGTH_SHORT).show();
return;
}else{
// 模擬浏覽器 http的get請求 獲取圖片數據 並展現到界面上
try {
URL url = new URL(path); //url不合法的異常
HttpURLConnection conn=
(HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000); // 網絡超時的異常
//服務器返回回來的狀態碼
int code =conn.getResponseCode();
if(code == 200){
//獲取響應數據的長度
String length = conn.getContentLength()+"";
//響應數據的類型
String type = conn.getContentType();
// 獲取服務器返回過來的流的信息
InputStream is = conn.getInputStream();
//將流轉成bitMap對象
Bitmap bitmap =BitmapFactory.decodeStream(is); //io 異常
//將bitMap設置給ImageView
iv.setImageBitmap(bitmap);
}else {
Toast.makeText(this, "圖片的不存在,或者服務器異常",Toast.LENGTH_SHORT).show();
} catch (Exception e) {
e.printStackTrace();
//Toast.makeText(this,
"訪問圖片出錯", Toast.LENGTH_SHORT).show();
if(e instanceofMalformedURLException){
Toast.makeText(this,
"url不合法", Toast.LENGTH_SHORT).show();
}else if(e instanceofSocketTimeoutException){
"網絡連接超時", Toast.LENGTH_SHORT).show();
}else if(e instanceofIOException){
"照片數據錯誤", Toast.LENGTH_SHORT).show();
"未知錯誤", Toast.LENGTH_SHORT).show();
android:text="請輸入網頁的路徑" />
android:text="http://192.168.1.247:8080/web/index.jsp"
android:hint="請輸入網頁的路徑"
android:onClick="viewHtml"
android:text="查看"
//時,就會出現側拉條。
android:layout_height="match_parent">
android:id="@+id/tv"
public void viewHtml(Viewview) {
String path =et_path.getText().toString().trim();
if("".equals(path)) {
Toast.makeText(this, "路徑不能為空", 0).show();
} else {
//創建url對象
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setRequestMethod("GET"); //可以不寫
conn.setConnectTimeout(5000);
int code = conn.getResponseCode();
InputStream is =conn.getInputStream();
//將輸入流轉成字節數組.
byte[] result = StreamTools.getBytes(is);
tv.setText(new String(result));
Toast.makeText(this, "io錯誤", 0).show();
} catch (IOException e){
Toast.makeText(this, "協議不支持,io錯誤", 0).show();
} catch (MalformedURLException e) {
Toast.makeText(this,"url不合法", 0).show();
android:orientation="vertical" >//豎直
android:id="@+id/lv"
android:background="#449f9f9f" //設置項目的背景色
android:orientation="horizontal">//水平
android:id="@+id/iv_item_icon"
android:layout_height="48dip"
android:src="@drawable/default1" />
android:gravity="center_horizontal"
android:id="@+id/tv_item_title"
android:text="標題" />
android:id="@+id/tv_item_time"
android:text="播放時間"
android:textColor="@color/green" />//顯示字體的顏色
android:id="@+id/tv_item_count"
android:text="點播次數"
android:textColor="@color/green" />
public class DemoActivity extends Activity {
private ListView lv
private ChannelService service;
private List<Channel>channels;
private LayoutInflater inflater;
public void onCreate(Bundle savedInstanceState) {
lv = (ListView) this.findViewById(R.id.lv);//獲取列表
//獲取布局填充器
inflater = LayoutInflater.from(this);
//創建服務類的對象
service = new ChannelService(this);
//調用service層的方法將服務端獲取的xml轉成channel對象的list集合
channels = service.getChannels();
//為listView設置中項目之間的分隔線顏色的高度
lv.setDivider(new ColorDrawable(Color.WHITE));
lv.setDividerHeight(1);//高度
//為ListView設置適配器
lv.setAdapter(new MyAdapter());
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterViewparent, View view,
int position, long id) {
//同id獲取listView中項目
Channel channel = (Channel) lv.getItemAtPosition(position);
String title =channel.getTitle();
System.out.println("播放"+ title+"提交請求給服務器,通知播放次數加1");
});
private class MyAdapter extends BaseAdapter {
public int getCount() {
return channels.size();
public Object getItem(int position) {
// TODO Auto-generated methodstub
return channels.get(position);
public long getItemId(int position) {
return position;
public View getView(int position, ViewconvertView, ViewGroup parent) {
/*
* TextView tv = newTextView(DemoActivity.this);
* tv.setText(channels.get(position).getTitle());
*/
Channel channel = channels.get(position);
//通過布局填充器將layout下的item.xml轉成view對象
View view = inflater.inflate(R.layout.item,null);
//分別獲取item.xml文件中定義的組件
TextView tv_count = (TextView)view.findViewById(R.id.tv_item_count);
TextView tv_time= (TextView) view.findViewById(R.id.tv_item_time);
TextView tv_title = (TextView) view.findViewById(R.id.tv_item_title);
//為組件設置值
tv_count.setText("點播次數:" + channel.getCount());
tv_time.setText("播放時間:" + channel.getTime());
tv_title.setText(channel.getTitle());
//獲取imageView對象
ImageView iv = (ImageView)view.findViewById(R.id.iv_item_icon);
String iconpath =channel.getIconpath();
// 判斷, 判斷sd卡上是否有這個圖片文件存在 如果有的話 使用sd卡的圖片
// 如果沒有 才去下載這個圖片
String iconname =getIconName(iconpath);
//將圖片封裝成對象
File file = new File(Environment.getExternalStorageDirectory(),
iconname);
if (file.exists()) {//判斷sd卡上是否存在圖片
System.out.println("使用sd卡的緩存圖片");
iv.setImageURI(Uri.fromFile(file));
//通過地址獲取圖片
URL url = new URL(iconpath);
HttpURLConnection conn =
if(conn.getResponseCode()==200){
Bitmap bitmap = BitmapFactory.decodeStream(is);
if (bitmap != null) {//判斷從服務器端獲取的圖片是否存在
iv.setImageBitmap(bitmap);//為imageView設置圖片
// format 圖片的格式
FileOutputStreamstream;
stream = new FileOutputStream(file);
System.out.println("使用的是下載的圖片");
// 數據會被寫到sd卡的file對象裡面
bitmap.compress(CompressFormat.JPEG, 100, stream);
} catch (FileNotFoundException e) {
}// 如果為空 顯示默認的圖片
return view;
/**
* 獲取一個圖片路徑對應的圖片名字
*
* @param path
* @return
private String getIconName(Stringpath) {
int start = path.lastIndexOf("/");
return path.substring(start + 1);
public class ChannelService {
private Context context;
public ChannelService(Contextcontext) {
this.context = context;
public ListgetChannels() throws Exception {
//請求服務端
String path =context.getResources().getString(R.string.serverurl);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
if( conn.getResponseCode()==200){
//獲取的輸入流
//1. 得到xml的解析器
XmlPullParser parser = Xml.newPullParser();
//2. 初始化解析器
parser.setInput(is,"utf-8");
int type =parser.getEventType();
Listchannles = new ArrayList();
Channel channel = null;
while(type!=XmlPullParser.END_DOCUMENT){
switch (type) {
case XmlPullParser.START_TAG:
if("channel".equals(parser.getName())){
channel = new Channel();
}elseif("title".equals(parser.getName())){
channel.setTitle(parser.nextText());
else if("time".equals(parser.getName())){
channel.setTime(parser.nextText());
elseif("count".equals(parser.getName())){
channel.setCount(Integer.parseInt(
parser.nextText()));
elseif("iconpath".equals(parser.getName())){
channel.setIconpath(parser.nextText());
break;
case XmlPullParser.END_TAG:
channles.add(channel);
channel = null;
type = parser.next();
return channels;
return null;
2314
http://192.168.1.247:8080/web/a.jpg
314
http://192.168.1.247:8080/web/b.jpg
由於手機屏幕的高度有限,所以如果面對組件要顯示多組信息的時候,ScrollView視圖(滾動視圖)可以有效的安排這些組件,浏覽時可以自動的進行滾屏的操作。 android
第十六章、訪問者模式 訪問者模式是一種行為型模式,它是23種設計模式中最復雜的一個,雖然使用頻率不高,但是並不代表可以忽略,在合適的地方,它會帶來意想不到的靈活性。訪問者
支付寶的快捷支付Android版業務流程比較麻煩,出現的意外情況比較多.在此,簡單說下開發流程以及出現錯誤的解決方案; 1.注冊支付業務.這裡不在贅述.建立數據安全傳輸所
最近一直在看各路大神的自定義控件,自己受益非淺,可是一直也沒有自己動手寫一個,這幾天有一個項目中要求有如下圖這樣一個功能:兩個動態值,根據其占比,在這個橫柱上顯示出來,中
我們在ListView中需要下載資源時,贊不考慮緩存機制,那麼每一個It
上一篇我們主要了解了為什麼適配,以及怎麼適配,同時給出了部分切圖規范,和
浏覽器是否能哆無縫地渲染播放器的輸出,取決於播放器是否有良好的設計。一個
簡單實現的短信發送器,效果截圖如下: 其中的java代碼如下:pack