㈠ 關於android動態布局添加和刪除View的問題……
java">{
privateLinearLayoutlayout;
privateTextViewtextView;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
layout=newLinearLayout(this);//變數layout是該Activity的成員變數(privateLinearLayoutlayout)
layout.setOrientation(LinearLayout.VERTICAL);//設置layout布局方向為垂直
setContentView(layout);
//接下來向layout中添加TextView
textView=newTextView(this);
textView.setText("ThisIsaTextView");
layout.addView(textView);
}
@Override
protectedvoidonResume(){
//TODOAuto-generatedmethodstub
layout.removeView(textView);
super.onResume();
}
}
但是Activity在啟動的時候調用onCreate()之後也會調用onResume()方法,所以進入程序也看不到textview了
㈡ android removeView用法
直接給你上代碼吧,寫了我半個小時,經過了我的測試了的~
運行下就能看到結果了~關鍵的remove的時候有給你寫注釋~
布局的layout文件內容:
----------------------------------------------------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android=""
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:id="@+id/linearlayout">
<LinearLayout android:id="@+id/LinearLayout01"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<Button android:layout_height="wrap_content" android:id="@+id/add"
android:text="Add" android:layout_width="100px"></Button>
<Button android:layout_height="wrap_content"
android:layout_width="100px" android:text="Remove" android:id="@+id/remove"></Button>
</LinearLayout>
<TextView android:id="@+id/TextView01" android:text="This is textView."
android:layout_width="fill_parent" android:gravity="center"
android:layout_height="50px"></TextView>
</LinearLayout>
----------------------------------------------------------------------------------
對應Activity的內容:
----------------------------------------------------------------------------------
package com.foxconn.dialog;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
public class DialogTest extends Activity implements OnClickListener {
private Button add_btn, remove_btn;
private LinearLayout linearLayout;
private int index = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
findViews();
register();
}
private void register() {
add_btn.setOnClickListener(this);
remove_btn.setOnClickListener(this);
}
private void findViews() {
add_btn = (Button) findViewById(R.id.add);
remove_btn = (Button) findViewById(R.id.remove);
linearLayout = (LinearLayout) findViewById(R.id.linearlayout);
}
protected View createView() {
Button btn = new Button(this);
btn.setId(index++);
btn.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
btn.setText("aaaaaa" + index);
return btn;
}
private void removeView() {
//獲取linearlayout子view的個數
int count = linearLayout.getChildCount();
//研究整個LAYOUT布局,第0位的是含add和remove兩個button的layout
//第count-1個是那個文字被置中的textview
//因此,在remove的時候,只能操作的是0<location<count-1這個范圍的
//在執行每次remove時,我們從count-2的位置即textview上面的那個控制項開始刪除~
if (count - 2 > 0) {
//count-2>0用來判斷當前linearlayout子view數多於2個,即還有我們點add增加的button
linearLayout.removeViewAt(count - 2);
}
}
public void onClick(View v) {
switch (v.getId()) {
case R.id.add:
linearLayout.addView(createView(), 1);
break;
case R.id.remove:
removeView();
break;
default:
break;
}
}
}
----------------------------------------------------------------------------------
㈢ Android 怎麼在程序運行過程中銷毀View
只是不顯示的話用View.setVisibility(boolean visibility)就行了,畫面Layout會自動調整的。
另外畫面用fragment來做,gridview和gallery分別做兩個fragment,用FragmentManager來管理的話只會各生成一個實例,不會占太多內存
㈣ Android桌面懸浮窗效果怎麼實現
先談一下基本的實現原理,這種桌面懸浮窗的效果很類似與Widget,但是它比Widget要靈活的多。主要是通過WindowManager這個類來實現的,調用這個類的addView方法用於添加一個懸浮窗,updateViewLayout方法用於更新懸浮窗的參數,removeView用於移除懸浮窗。其中懸浮窗的參數有必要詳細說明一下。
WindowManager.LayoutParams這個類用於提供懸浮窗所需的參數,其中有幾個經常會用到的變數:
type值用於確定懸浮窗的類型,一般設為2002,表示在所有應用程序之上,但在狀態欄之下。
flags值用於確定懸浮窗的行為,比如說不可聚焦,非模態對話框等等,屬性非常多,大家可以查看文檔。
gravity值用於確定懸浮窗的對齊方式,一般設為左上角對齊,這樣當拖動懸浮窗的時候方便計算坐標。
x值用於確定懸浮窗的位置,如果要橫向移動懸浮窗,就需要改變這個值。
y值用於確定懸浮窗的位置,如果要縱向移動懸浮窗,就需要改變這個值。
width值用於指定懸浮窗的寬度。
height值用於指定懸浮窗的高度。
創建懸浮窗這種窗體需要向用戶申請許可權才可以的,因此還需要在AndroidManifest.xml中加入
㈤ Android:窗口、自定義view、bitmap
1、ViewRoot 對應於 ViewRootImpl 類,它是連接 WindowManager 和 DecorView 的紐帶,View 的三大流程均是通過 ViewRoot 來完成的。在 ActivityThread 中,當 Activity 對象被創建完畢後,會將 DecorView 添加到 Window 中,同時會創建 ViewRootImpl 對象,並將 ViewRootImpl 對棚彎象和 DecorView 建立關聯
2、 自定義View-繪制流程概述
4、 Android Handler
6、 Android Bitmap
2、MeasureSpec:
3、一般來說,使用多進程會造成以下幾個方面的問題:
5、Window 概念與分類:
Window 是一個抽象類,它的具體實現是 PhoneWindow。WindowManager 是外界訪問 Window 的入口,Window 的具體實現位於 WindowManagerService 中,WindowManager 和 WindowManagerService 的交互是一個 IPC 過程。Android 中所有的視圖都是通過 Window 來呈現,因此 Window 實際是 View 的直接管理者。
6、window的三大操作:addView、upView、removeView
7、 Bitmap 中有兩個內部枚舉類:
保存圖片資源:
圖片壓縮:
基本使用:
8、Context 本身是一個抽象類,是對一系列系統服務介面的封裝,包括:內部伏叢資源、包、類載入、I/O操作、許可權、主線程、IPC 和組件啟動等操作的管理。ContextImpl, Activity, Service, Application 這些都是 Context 的直接或間接子類
9、SharedPreferences 採用key-value(鍵值對)形式, 主要用於輕量級的數據存儲, 尤其適合保存應用的配置參數, 但不建議使用 SharedPreferences 來存儲大規模的數據, 可能會降低性能
10、SharedPreferences源碼有用synchronize進行加鎖同步
11、Handler 有兩個主要用途:
(1)安排 Message 和 runnables 在將來的某個時刻執行;
(2)將要在不同鏈廳悶於自己的線程上執行的操作排入隊列。(在多個線程並發更新UI的同時保證線程安全。)
只有主線程能對UI進行操作,所以在對UI進行跟改之前,ViewRootImpl 對UI操作做了驗證,這個驗證工作是由 ViewRootImpl的 checkThread 方法完成:
12、ThreadLocal 是一個線程內部的數據存儲類,通過它可以在指定的線程中存儲數據,其他線程則無法獲取。Looper、ActivityThread 以及 AMS 中都用到了 ThreadLocal。當不同線程訪問同一個ThreadLocal 的 get方法,ThreadLocal 內部會從各自的線程中取出一個數組,然後再從數組中根據當前 ThreadLcoal 的索引去查找對應的value值:
13、Android 提供了幾種途徑來從其他線程訪問 UI 線程:
Android單線程模式必須遵守的規則:
14、HandlerThread 集成了 Thread,卻和普通的 Thread 有顯著的不同。普通的 Thread 主要用於在 run 方法中執行一個耗時任務,而 HandlerThread 在內部創建了消息隊列,外界需要通過 Handler 的消息方式通知 HanderThread 執行一個具體的任務。
15、IntentService 可用於執行後台耗時的任務,當任務執行後會自動停止,由於其是 Service 的原因,它的優先順序比單純的線程要高,所以 IntentService 適合執行一些高優先順序的後台任務。在實現上,IntentService 封裝了 HandlerThread 和 Handler。IntentService 第一次啟動時,會在 onCreatea 方法中創建一個 HandlerThread,然後使用的 Looper 來構造一個 Handler 對象 mServiceHandler,這樣通過 mServiceHandler 發送的消息最終都會在 HandlerThread 中執行。每次啟動 IntentService,它的 onStartCommand 方法就會調用一次,onStartCommand 中處理每個後台任務的 Intent,onStartCommand 調用了 onStart 方法。可以看出,IntentService 僅僅是通過 mServiceHandler 發送了一個消息,這個消息會在 HandlerThread 中被處理。mServiceHandler 收到消息後,會將 Intent 對象傳遞給 onHandlerIntent 方法中處理,執行結束後,通過 stopSelf(int startId) 來嘗試停止服務。(stopSelf() 會立即停止服務,而 stopSelf(int startId) 則會等待所有的消息都處理完畢後才終止服務)。
16、RecyclerView 優化