1. android 實例化對象找不到getContext()方法 怎麼辦
這個是前後文對象,用this就可以了。如果需要其他Activity的前後文對象就用Bundle傳過來。
2. Android 中如何在java類中調用activity 中的一個方法
通常,您不應該以這種方式創建新的 MainActivity 實例。要打開一個新的 MainActivity,請使用 Intent。在您的情況下,您應該引用原始 MainActivity 實例,並在那裡調用此方法。不要以任何方式創建新的,因為您已經在運行它。
一個簡單的解決方法:
MainActivity.this.myMethod("Hello there")
您不必存儲mContext. 你已經在 MainActivity 裡面了。
因此,完整的代碼將是:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView myWebView = findViewById(R.id.webview);
myWebView.loadUrl("http://www.google.com");
myWebView.addJavascriptInterface(new WebAppInterface(), "Android");
}
public void myMethod(String test){
Toast.makeText(this, test, Toast.LENGTH_SHORT).show();
}
public class WebAppInterface {
/** Show a toast from the web page */
@JavascriptInterface
public void showToast(String toast) {
MainActivity.this.myMethod("Hello there");
}
}
}
實際上,我認為您甚至可以避免使用MainActivity.this., 並myMethod直接調用。
3. android 主activity用什麼啟動模式
在android里,有4種activity的啟動模式,分別為:
「standard」 (默認)
「singleTop」
「singleTask」
「singleInstance」
1. 如何決定所屬task
「standard」和」singleTop」的activity的目標task,和收到的Intent的發送者在同一個task內,除非intent包括參數FLAG_ACTIVITY_NEW_TASK。
如果提供了FLAG_ACTIVITY_NEW_TASK參數,會啟動到別的task里。
2. 是否允許多個實例
「standard」和」singleTop」可以被實例化多次,並且存在於不同的task中,且一個task可以包括一個activity的多個實例;
「singleTask」和」singleInstance」則限制只生成一個實例,並且是task的根元素。
singleTop要求如果創建intent的時候棧頂已經有要創建 的Activity的實例,則將intent發送給該實例,而不發送給新的實例。
3. 是否允許其它activity存在於本task內
「singleInstance」獨佔一個task,其它activity不能存在那個task里;如果它啟動了一個新的activity,不管新的activity的launch mode 如何,新的activity都將會到別的task里運行(如同加了FLAG_ACTIVITY_NEW_TASK參數)。
而另外三種模式,則可以和其它activity共存。
4. 是否每次都生成新實例
「standard」對於沒一個啟動Intent都會生成一個activity的新實例;
「singleTop」的activity如果在task的棧頂的話,則不生成新的該activity的實例,直接使用棧頂的實例,否則,生成該activity的實例。
比如現在task棧元素為A-B-C-D(D在棧頂),這時候給D發一個啟動intent,如果D是 「standard」的,則生成D的一個新實例,棧變為A-B-C-D-D。
如果D是singleTop的話,則不會生產D的新實例,棧狀態仍為A-B-C-D
如果這時候給B發Intent的話,不管B的launchmode是」standard」 還是 「singleTop」 ,都會生成B的新實例,棧狀態變為A-B-C-D-B。
「singleInstance」是其所在棧的唯一activity,它會每次都被重用。
「singleTask」如果在棧頂,則接受intent,否則,該intent會被丟棄,但是該task仍會回到前台。
當已經存在的activity實例處理新的intent時候,會調用onNewIntent()方法
如果收到intent生成一個activity實例,那麼用戶可以通過back鍵回到上一個狀態;如果是已經存在的一個activity來處理這個intent的話,用戶不能通過按back鍵返回到這之前的狀態。
總結如下:
standard 每次都會新建,每個Task都可以有,且每個Task都可以有多個實例(每個Task都可以有,且可以有多個)
singleTop 當前實例如果在棧頂,就不新建實例,調用其OnNewIntent。 如不在棧頂,則新建實例 (每個Task都可以有,且可以有多個,在棧頂時可復用)
singleTask 新建一個Task,如果已經有其他的Task並且包含該實例,那就直接調用那個Task的實例。(只有一個Task中會有)
singleInstance 新建一個Task,且在該Task中只有它的唯一一個實例。 (只有一個Task會有,且該Task中只有它)
FLAG_ACTIVITY_NEW_TASK 類似singleTask
FLAG_ACTIVITY_SINGLE_TOP 類似singleTop
FLAG_ACTIVITY_CLEAR_TOP 無對應
4. android activity單實例化什麼意思
意思就是這個Activity只能有一個實例(如果被多次啟動的話)x0dx0ax0dx0amanifest.xml裡面配置 在activity標簽下的屬性x0dx0ax0dx0aandroid:launchMode="standard"x0dx0a有4種可以選 默認就是上面這種,,標準的 每次startActivity都會實例化一個實例x0dx0a還有3種:singleTop 啟動此模式的activity的時候 如果在堆棧頂部已經有這個activity的實例則不重新實例化,就用堆棧頂部這個 否則就實例化一個新的activity對象x0dx0a singleTask 啟動此模式的activity的時候 如果在堆棧中存在此activity的實例(任意位置),則不重新實例化activity對象 而是直接復用之前的activity對象 在這個activity對象上面的其他activity對象全部移除(相當於這些activity被銷毀了);這個應該就是你說的單實例化x0dx0a singleInstance 這個是單個實例 會單獨啟動一個堆棧來存放此啟動模式的activity實例!
5. 安卓里,想在activity中調用頁面中一個LinearLayout,怎麼實例化這個布局控制項
和TextView Button等控制項一樣,在xml中給這個LinearLayout添加id屬性,然後在Activity中findViewById
6. Android屬性匯總
TextView屬性匯總
android:autoLink設置是否當文本為URL鏈接/email/電話號碼/map時,文本顯示為可點擊的鏈接。可選值(none/web/email/phone/map/all)
android:autoText如果設置,將自動執行輸入值的拼寫糾正。此處無效果,在顯示輸入法並輸入的時候起作用。
android:bufferType指定getText()方式取得的文本類別。選項editable 類似於StringBuilder可追加字元,也就是說getText後可調用append方法設置文本內容。spannable 則可在給定的字元區域使用樣式,參見這里1、這里2。
android:capitalize設置英文字母大寫類型。此處無效果,需要彈出輸入法才能看得到,參見EditView此屬性說明。
android:cursorVisible設定游標為顯示/隱藏,默認顯示。
android:digits設置允許輸入哪些字元。如「1234567890.+-*/% ()」
android:drawableBottom在text的下方輸出一個drawable,如圖片。如果指定一個顏色的話會把text的背景設為該顏色,並且同時和background使用時覆蓋後者。
android:drawableLeft在text的左邊輸出一個drawable,如圖片。
android:drawablePadding設置text與drawable(圖片)的間隔,與drawableLeft、 drawableRight、drawableTop、drawableBottom一起使用,可設置為負數,單獨使用沒有效果。
android:drawableRight在text的右邊輸出一個drawable。
android:drawableTop在text的正上方輸出一個drawable。
android:editable設置是否可編輯。
android:editorExtras設置文本的額外的輸入數據。
android:ellipsize設置當文字過長時,該控制項該如何顯示。有如下值設置:」start」—-省略號顯示在開頭;」end」 ——省略號顯示在結尾;」middle」—-省略號顯示在中間;」marquee」 ——以跑馬燈的方式顯示(動畫橫向移動)
android:freezesText設置保存文本的內容以及游標的位置。
android:gravity設置文本位置,如設置成「center」,文本將居中顯示。
android:hintText為空時顯示的文字提示信息,可通過textColorHint設置提示信息的顏色。此屬性在 EditView中使用,但是這里也可以用。
android:imeOptions附加功能,設置右下角IME動作與編輯框相關的動作,如actionDone右下角將顯示一個「完成」,而不設置默認是一個回車符號。這個在EditView中再詳細說明,此處無用。
android:imeActionId設置IME動作ID。
android:imeActionLabel設置IME動作標簽。
android:includeFontPadding設置文本是否包含頂部和底部額外空白,默認為true。
android:inputMethod為文本指定輸入法,需要完全限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin,但是這里報錯找不到。
android:inputType設置文本的類型,用於幫助輸入法顯示合適的鍵盤類型。在EditView中再詳細說明,這里無效果。
android:linksClickable設置鏈接是否點擊連接,即使設置了autoLink。
android:marqueeRepeatLimit在ellipsize指定marquee的情況下,設置重復滾動的次數,當設置為 marquee_forever時表示無限次。
android:ems設置TextView的寬度為N個字元的寬度。這里測試為一個漢字字元寬度
android:maxEms設置TextView的寬度為最長為N個字元的寬度。與ems同時使用時覆蓋ems選項。
android:minEms設置TextView的寬度為最短為N個字元的寬度。與ems同時使用時覆蓋ems選項。
android:maxLength限制顯示的文本長度,超出部分不顯示。
android:lines設置文本的行數,設置兩行就顯示兩行,即使第二行沒有數據。
android:maxLines設置文本的最大顯示行數,與width或者layout_width結合使用,超出部分自動換行,超出行數將不顯示。
android:minLines設置文本的最小行數,與lines類似。
android:lineSpacingExtra設置行間距。
android:lineSpacingMultiplier設置行間距的倍數。如」1.2」
android:numeric如果被設置,該TextView有一個數字輸入法。此處無用,設置後唯一效果是TextView有點擊效果,此屬性在EdtiView將詳細說明。
android:password以小點」.」顯示文本
android:phoneNumber設置為電話號碼的輸入方式。
android:privateImeOptions設置輸入法選項,此處無用,在EditText將進一步討論。
android:scrollHorizontally設置文本超出TextView的寬度的情況下,是否出現橫拉條。
android:selectAllOnFocus如果文本是可選擇的,讓他獲取焦點而不是將游標移動為文本的開始位置或者末尾位置。 TextView中設置後無效果。
android:shadowColor指定文本陰影的顏色,需要與shadowRadius一起使用。
android:shadowDx設置陰影橫向坐標開始位置。
android:shadowDy設置陰影縱向坐標開始位置。
android:shadowRadius設置陰影的半徑。設置為0.1就變成字體的顏色了,一般設置為3.0的效果比較好。
android:singleLine設置單行顯示。如果和layout_width一起使用,當文本不能全部顯示時,後面用「…」來表示。如android:text="test_ singleLine "
android:singleLine="true" android:layout_width="20dp"將只顯示「t…」。如果不設置singleLine或者設置為false,文本將自動換行
android:text設置顯示文本.
android:textAppearance設置文字外。如 「?android:attr/textAppearanceLargeInverse」這里引用的是系統自帶的一個外觀,?表示系統是否有這種外觀,否則使用默認的外觀。可textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse
android:textColor設置文本顏色
android:textColorHighlight被選中文字的底色,默認為藍色
android:textColorHint設置提示信息文字的顏色,默認為灰色。與hint一起使用。
android:textColorLink文字鏈接的顏色.
android:textScaleX設置文字之間間隔,默認為1.0f。
android:textSize設置文字大小,推薦度量單位」sp」,如」15sp」
android:textStyle設置字形[bold(粗體) 0, italic(斜體) 1, bolditalic(又粗又斜) 2] 可以設置一個或多個,用「|」隔開
android:typeface設置文本字體,必須是以下常量值之一:normal 0, sans 1, serif 2, monospace(等寬字體) 3]
android:height設置文本區域的高度,支持度量單位:px(像素)/dp/sp/in/mm(毫米)
android:maxHeight設置文本區域的最大高度
android:minHeight設置文本區域的最小高度
android:width設置文本區域的寬度,支持度量單位:px(像素)/dp/sp/in/mm(毫米),與layout_width 的區別看這里。
android:maxWidth設置文本區域的最大寬度
android:minWidth設置文本區域的最小寬度
Android activity屬性匯總
android:allowTaskReparenting
是否允許activity更換從屬的任務,比如從簡訊息任務 切換到瀏覽器任務。
android:alwaysRetainTaskState
是否保留狀態不變, 比如切換回home, 再從新打開, activity處於最後的狀態
android:clearTaskOnLanunch
比如 P 是 activity, Q 是被P 觸發的 activity, 然後返回Home, 從新啟動 P, 是否顯示 Q
android:configChanges
當配置list發生修改時,是否調用 onConfigurationChanged() 方法 比如 "locale|navigation|orientation".
android:enabled
activity 是否可以被實例化,
android:excludeFromRecents
是否可被顯示在最近打開的activity列表裡
android:exported
是否允許activity被其它程序調用
android:finishOnTaskLaunch
是否關閉已打開的activity當用戶重新啟動這個任務的時候
android.icon
android:label
android:launchMode
activity啟動方式, "standard" "singleTop" "singleTask" "singleInstance"
其中前兩個為一組, 後兩個為一組
android:multiprocess
允許多進程
android:name
activity的類名, 必須指定
androidnHistory
是否需要移除這個activity當用戶切換到其他屏幕時。 這個屬性是 API level 3 中引入的
android:permission
android:process
一 個activity運行時所在的進程名,所有程序組件運行在應用程序默認的進程中,這個進程名跟應用程序的包名一致。中的元素process屬性能夠為所有組件設定一個新的默認值。但是任何組件都可以覆蓋這個默認值,允許你將你的程序放在多進程中運行。 如果這個屬性被分配的名字以:開頭,當這個activity運行時, 一個新的專屬於這個程序的進程將會被創建。 如果這個進程名以小寫字母開頭,這個activity將會運行在全局的進程中,被它的許可所提供。
android:screenOrientation
activity顯示的模式, "unspecified" 默認值 "landscape" 風景畫模式,寬度比高度大一些 "portrait" 肖像模式, 高度比寬度大。 "user" 用戶的設置 "behind" "sensor" "nosensor"
android:stateNotNeeded
是否 activity被銷毀和成功重啟並不保存狀態
android:taskAffinity
activity的親屬關系, 默認情況同一個應用程序下的activity有相同的關系
android:theme
activity的樣式主題, 如果沒有設置,則activity的主題樣式從屬於應用程序, 參見元素的theme屬性
android:windowSoftInputMode
activity主窗口與軟鍵盤的交互模式, 自從API level 3 被引入
活動的主窗口如何與包含屏幕上的軟鍵盤窗口交互。這個屬性的設置將會影響兩件事情:
1> 軟鍵盤的狀態——是否它是隱藏或顯示——當活動(Activity)成為用戶關注的焦點。
2> 活動的主窗口調整——是否減少活動主窗口大小以便騰出空間放軟鍵盤或是否當活動窗口的部分被軟鍵盤覆蓋時它的內容的當前焦點是可見的。
它的設置必須是下面列表中的一個值,或一個」state…」值加一個」adjust…」值的組合。在任一組設置多個值——多個」state…」values,例如&mdash有未定義的結果。各個值之間用|分開。例如: <activity android:windowSoftInputMode="stateVisible|adjustResize" . . . >
在這設置的值(除"stateUnspecified"和"adjustUnspecified"以外)將覆蓋在主題中設置的值
值 描述
"stateUnspecified" 軟鍵盤的狀態(是否它是隱藏或可見)沒有被指定。系統將選擇一個合適的狀態或依賴於主題的設置。這個是為了軟體盤行為默認的設置。
"stateUnchanged" 軟鍵盤被保持無論它上次是什麼狀態,是否可見或隱藏,當主窗口出現在前面時。
"stateHidden" 當用戶選擇該Activity時,軟鍵盤被隱藏——也就是,當用戶確定導航到該Activity時,而不是返回到它由於離開另一個Activity。
"stateAlwaysHidden" 軟鍵盤總是被隱藏的,當該Activity主窗口獲取焦點時。
"stateVisible" 軟鍵盤是可見的,當那個是正常合適的時(當用戶導航到Activity主窗口時)。
"stateAlwaysVisible" 當用戶選擇這個Activity時,軟鍵盤是可見的——也就是,也就是,當用戶確定導航到該Activity時,而不是返回到它由於離開另一個Activity。
"adjustUnspecified" 它不被指定是否該Activity主窗口調整大小以便留出軟鍵盤的空間,或是否窗口上的內容得到屏幕上當前的焦點是可見的。系統將自動選擇這些模式中一種主要依賴於是否窗口的內容有任何布局視圖能夠滾動他們的內容。如果有這樣的一個視圖,這個窗口將調整大小,這樣的假設可以使滾動窗口的內容在一個較小的區域中可見的。這個是主窗口默認的行為設置。
"adjustResize" 該Activity主窗口總是被調整屏幕的大小以便留出軟鍵盤的空間。
"adjustPan" 該Activity主窗口並不調整屏幕的大小以便留出軟鍵盤的空間。相反,當前窗口的內容將自動移動以便當前焦點從不被鍵盤覆蓋和用戶能總是看到輸入內容的部分。這個通常是不期望比調整大小,因為用戶可能關閉軟鍵盤以便獲得與被覆蓋內容的交互操作。
Android EditText 屬性匯總
android:layout_gravity="center_vertical"
設置控制項顯示的位置:默認top,這里居中顯示,還有bottom
android:hint="請輸入數字!"
設置顯示在空間上的提示信息
android:numeric="integer"
設置只能輸入整數,如果是小數則是:decimal
android:singleLine="true"
設置單行輸入,一旦設置為true,則文字不會自動換行。
android:password="true"
設置只能輸入密碼
android:textColor = "#ff8c00"
字體顏色
android:textStyle="bold"
字體,bold, italic, bolditalic
android:textSize="20dip"
大小
android:capitalize = "characters"
以大寫字母寫
android:textAlign="center"
EditText沒有這個屬性,但TextView有
android:textColorHighlight="#cccccc"
被選中文字的底色,默認為藍色
android:textColorHint="#ffff00"
設置提示信息文字的顏色,默認為灰色
android:textScaleX="1.5"
控制字與字之間的間距
android:typeface="monospace"
字型,normal, sans, serif, monospace
android:background="@null"
空間背景,這里沒有,指透明
android:layout_weight="1"
權重,控制控制項之間的地位,在控制控制項顯示的大小時蠻有用的。
android:textAppearance="?android:attr/textAppearanceLargeInverse"
文字外觀,這里引用的是系統自帶的一個外觀,?表示系統是否有這種外觀,否則使用默認的外觀。不知道這樣理解對不對?
通過EditText的layout xml文件中的相關屬性來實現:
1. 密碼框屬性 android:password="true" 這條可以讓EditText顯示的內容自動為星號,輸入時內容會在1秒內變成*字樣。
2. 純數字 android:numeric="true" 這條可以讓輸入法自動變為數字輸入鍵盤,同時僅允許0-9的數字輸入
3. 僅允許 android:capitalize="cwj1987" 這樣僅允許接受輸入cwj1987,一般用於密碼驗證
下面是一些擴展的風格屬性
android:editable="false" 設置EditText不可編輯
android:singleLine="true" 強制輸入的內容在單行
android:ellipsize="end" 自動隱藏尾部溢出數據,一般用於文字內容過長一行無法全部顯示時
---------------------
7. 安卓中Activity的生命周期是什麼
在Activity生命周期中,系統調用App生命周期中設置的回調方法,這些生命周期回調方法在第一層就像一個金字塔。活動生命周期的每個階段都對應於金字塔的一個步驟。
當系統創建一個新的Activity實例時,回調方法從塔的底部一級一級地移動到塔的頂部。當它位於金字塔的頂部時,活動位於用戶的前台,此時用戶可以與活動進行交互。當用戶想要離開活動時,系統調用另一系列方法將活動的狀態從頂部移到底部。在某些情況下,Activity只完成部分狀態遷移並等待用戶的指令,然後返回到塔頂。
根據活動的復雜性,您可能不必實現所有的生命周期方法。但是,理解每個生命周期回調函數的含義非常重要,以確保您的應用程序按照用戶的期望正確運行。
要正確實現生命周期的回調方法,從而使應用程序正確動作,需要注意以下幾點:
確保用戶使用你時,應用程序可以接聽電話或切換到其他應用程序,而不會崩潰。確保您的應用程序在用戶不使用時不會消耗系統資源。
確保用戶在從其他應用程序切換回您的應用程序時可以繼續他們以前的工作,並且在切換用戶屏幕或其他操作時不會崩潰或丟失用戶數據。
8. Android 如何實現Activity與Activity之間持續通信。
實現兩個activity的通訊比較簡單,實現代碼如下:
XXXService
{
publicstaticfinalStringACTION_MESSAGE="message";
onStartCommand(xxx){
//yourlogicalxxx
sendBroadcastReceiver(newIntentFilter(ACTION_MESSAGE))
}
}
XXXActivity{
BroadcastReceiverreceiver=newBroadcastReceiver{
onReceive(context,intent){
if(XXXService.ACTION_MESSAGE.equals(intent.getAction())){
doSomething();
}
}
}
onCreate(){
//xxx
registerReceiver(receiver,newIntentFilter(XXXService.ACTION_MESSAGE));
}
onPause(){
unreigsterReceiver(receiver);
}
publicvoiddoSomething(){
xxx;
}
}
當需要讓後台運行的activity回到前台並傳遞一些數據可能就有些困難。
首先,在默認情況下,當通過intent啟到一個activity的時候,就算已經存在一個相同的正在運行的activity,系統都會創建一個 新的activity實例並顯示出來。為了不讓activity實例化多次,我們需要通過在AndroidManifest.xml配置activity 的載入方式(launchMode)以實現單任務模式,如下所示:
<activityandroid:label="@string/app_name"android:launchmode="singleTask"android:name="Activity1">
</activity>
launchMode為singleTask的時候,通過intent啟到一個activity,如果系統已經存在一個實例,系統就會將請求發送到這個實 例上,但這個時候,系統就不會再調用通常情況下我們處理請求數據的onCreate方法,而是調用onNewIntent方法,如下所示:
protectedvoidonNewIntent(Intentintent){
super.onNewIntent(intent);
setIntent(intent);//()willreturntheoldone
processExtraData();
}
不要忘記,系統可能會隨時殺掉後台運行的activity,如果這一切發生,那麼系統就會調用onCreate方法,而不調用onNewIntent方法,一個好的解決方法就是在onCreate和onNewIntent方法中調用同一個處理數據的方法,如下所示:
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
processExtraData();
}
protectedvoidonNewIntent(Intentintent){
super.onNewIntent(intent);
setIntent(intent);//()willreturntheoldone
processExtraData()
}
privatevoidprocessExtraData(){
Intentintent=getIntent();
//usethedatareceivedhere
}
9. android 大量控制項實例化不方便。
首先需要說的是,findViewById只是查找到對象的引用,不應該叫做控制項的實例化,
實例化是創建出一個新的對象
當程序中控制項數量太多時,findviewbyid代碼將會很多,很繁瑣,所以我們需要方法來簡化他
方法一:定義一個BaseActivity,所有activity都繼承這個BaseActivity,用一個$號來作為findviewbyid的作用,$在java中是合法的方法名
如下
{
public<TextendsView>T$(intid){
return(T)findViewById(id);
}
}
當我們需要獲得控制項引用時只需要使用一個$符號就行
Button btn = $(R.id.button);
而且不用強制轉換,節省了很多findviewbyid的代碼
方法二:使用網路上的開源框架,比如AndroidButterknife框架,使用註解來簡化findviewbyid
{
@InjectView(R.id.button)
privateButtonbutton;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
.....
ButterKnife.inject(this);
}
}
只要在view上加上@InjectView註解,並在onCreate里調用ButterKnife.inject即可
10. android activity單實例化什麼意思
意思就是這個Activity只能有一個實例(如果被多次啟動的話)
manifest.xml裡面配置 在activity標簽下的屬性
android:launchMode="standard"
有4種可以選 默認就是上面這種,,標準的 每次startActivity都會實例化一個實例
還有3種:singleTop 啟動此模式的activity的時候 如果在堆棧頂部已經有這個activity的實例則不重新實例化,就用堆棧頂部這個 否則就實例化一個新的activity對象
singleTask 啟動此模式的activity的時候 如果在堆棧中存在此activity的實例(任意位置),則不重新實例化activity對象 而是直接復用之前的activity對象 在這個activity對象上面的其他activity對象全部移除(相當於這些activity被銷毀了);這個應該就是你說的單實例化
singleInstance 這個是單個實例 會單獨啟動一個堆棧來存放此啟動模式的activity實例!