『壹』 android怎樣取得ViewGroup裡面的所有ImageView
希望對你銀遲有幫助!LinearLayoutlayout=newLinearLayout(this); intcount=layout.getChildCount(); ListallImageViews=newArrayList(); for(intindex=0;indexViewchild=layout.getChildAt(index); allImageViews.add((ImageView)child);}LZ你說的是這樣嗎?ViewGroup是所有Layout的抽象父尺搏中類陵山,所以這里LinearLayout作為一個示例。
『貳』 android 怎樣取得ViewGroup裡面的所有ImageView
LinearLayout layout = new LinearLayout(this);
int count = layout.getChildCount();
List<ImageView> allImageViews = new ArrayList<ImageView>();
for(int index = 0 ; index < count; index ++){
View child = layout.getChildAt(index);
if(child instanceof ImageView)
allImageViews.add((ImageView) child);
}
LZ你說的是這瞎碧枝樣嗎?ViewGroup是所有Layout的抽象父類,磨敏所以這里LinearLayout 作慧游為一個示例。
『叄』 android開發 BaseAdapter中getView()里的ViewGroup是什麼意思
應該去看下源碼,parent是item的view的父視圖,調整item寬高用的,你自慎橋定義一個viewGroup的時候除了通常要重寫onLayout onMeasure等凳孝清方法,計運算元view的寬高,如果有了這個parent參數,並且後面的attachToRoot值為否,則會從parent中提取layout_width和layout_height組成LayoutParams,設給convertView。
源碼棗前:
ViewGroup.LayoutParams params = null;
if (root != null) {
if (DEBUG) {
System.out.println("Creating params from root: " +
root);
}
// Create layout params that match root, if supplied
params = root.generateLayoutParams(attrs);
if (!attachToRoot) {
// Set the layout params for temp if we are not
// attaching. (If we are, we use addView, below)
temp.setLayoutParams(params);
}
}
if (root != null && attachToRoot) {
root.addView(temp, params);
}
// Decide whether to return the root that was passed in or the
// top view found in xml.
if (root == null || !attachToRoot) {
result = temp;
}
『肆』 Activity恢復時如何獲取Fragment
Activity 在重建的時候會恢復其包含的 FragmentManager ,FragmentManager 又會恢復其管理的 Fragment ,同理 Fragment 也會恢復其包含的 FragmentManager,層層遞進,直到全部恢復。
本文主要討論Activity重建的時候如何獲取Fragment的。即如下情況:
具體通過四種方法來獲取復用Fragment。
下面將對這四種情況分芹燃別加以分析說明。
首先來一個總結,不建議使用該方法獲取Fragment。理由有如下三點:
getFragments方法獲取的是所有已經添加到FragmentManager中的Fragment。但是這個FragmentManager中保存的不只是我們定義的Fragment,還有可能會包含其他用途的Fragment。
Fragment不僅僅是界面的載體,同時它可以用來實現生命周期的監聽,因為它的生命周期和Activity是一致的,當我們不好監聽Activity的生命周期的時候,就可以使用Fragment來輔助監聽。圖片載入庫Glide和Android Jet Pack中的ViewModel都使用了這種模式。
前段時間就遇到過這樣的bug
然後就出現了類型轉換異常,FragmentA不能被強制轉換成FragmentB。
當時我百思不得其解,為什麼會出現這個問題啊,我明明是按照Fragment添加到FragmentManager的順序去獲取Fragment的啊。
直到我將getFragments獲取到的Fragment列表列印出來才發現,其中的Fragment順序和我添加到FragmentManager中的順序是不一致的。
也就是說因為getFragments中獲取到的Fragment包含了你不想要的Fragment,而這些Fragment的初始化時機又是不可預料的,所以就不能通過Fragment列表准確定位你需要的Fragment。
這個情況我沒有遇到過,參考文章的作者 怪盜kidou 遇到過,就順便寫上了。
在版本25中Activity是新建的請款下,getFragments返回的是null,然後到了26版本,getFragments返回的就是Collectiions.EmpytList()。。。
這就導致原來基於null判斷的程序出現bug。
這個方法是通過Fragment中所在的ViewGroup的Android:id定義的id來查找,適合一個ViewGroup中只存在一個Fragment的情況。
當然,如果一個ViewGroup中有多個Fragment的情況下也是可以使用的,不過這個時候獲取的就是嫌扮虛最後添加到ViewGroup中的Fragment了。
該方法就是用來處理findFragmentById不適用的情況的。因為是通過Tag來查找Fragment,所以ViewGroup的id也就沒用了。
需要注意的地方:
有一種情況下是不能夠使用getFragmentById和缺吵getFragmentByTag,那就是使用ViewPager管理Fragment的情況。
這種方法是可用的,但是太過麻煩,可以使用fm.putFragment和fm.getFragment來處理這種情況。
這兩個方法的使用如下:
可能有朋友會感覺這個和getFragmentByTag那麼像呢,好像沒什麼區別。
重點來了,因為在ViewPager中添加和移除Fragment是由ViewPager控制的,所以像是
這種方法就不能被使用了,既然無法在添加fragment的時候設置tag,那我們就不能夠通過tag直接從FragmentManager中的Fragment列表中獲取了。
那putFragment和getFragment方法是怎麼做到這一點的呢?
我們查看下這兩個方法的源碼:
通過上述源碼,我們可以看出,putFragment將待存儲的Fragment的Tag和mIndex作為一組數據存儲在bundle中,然後在getFragment方法內先從bundle中取出對應Tag的mIndex,最後根據這個mIndex從mActive中取出對應的Fragment。
mActive是真正存儲Fragment的對象,但是我們不能夠直接使用Tag從中取出,因為ViewPager是使用mIndex來作為key值存儲Fragment的。所以我們只能夠退而求其次,將Tag和mIndex聯系起來,達到間接使用Tag取出Fragment的效果。
下面是對上述源碼及步驟的圖形化表示:
注意事項:
參考: 你真的會用Fragment嗎?Fragment復用的那些事兒
『伍』 Android編程之如何取得View的當前位置
你好,很高興為你解答
給要添加的view中設置view.setTag(index); index就是viewGroup的子view的個數,這樣通過getTag()就能獲取到index了
~如果你認可我的回答,請攜陪野及時點亂神擊【採納為滿意回答】按鈕
~~手機提問的朋友在客戶端右上角評價點【滿意辯喊】即可。
~你的採納是我前進的動力
~~O(∩_∩)O,記得好評和採納,互相幫助,謝謝。
『陸』 如何獲取Android UI元素
appium android獲取元素方式:
1. 1.元素標簽(tagname) 通過UI的控制項類型ListtextFieldsList=driver.findElements(By.tagName( textfield ));
2. 元素的位置(xpath) 具有一核跡蔽定約束的路徑抽州祥象標示, 基於XPath方式改州;
3. 元素的值(name) driver.findElement(By.name( Save )).click();通過元素的文本, 標簽, 或者id標示;
4. 元素的IDdriver.findElement(By.id(com.example.android.contactmanager:id/contactNameEditText )).getText();
『柒』 Android TV開發焦點移動源碼分析
點可以理解為選中態,在Android TV上起很重要的作用。一個視圖控制項只有在獲得焦點的狀態下,才能響應按鍵的Click事件。
相對於手機上用手指點擊屏幕產生的Click事件, 在TV中通過點擊遙控器的方向鍵來控制焦點的移動。當焦點移動到目標控制項上之後,按下遙控器的確定鍵,才會觸發一個Click事件,進而去做下一步的處理
在處理焦點的時候,有一些基礎的用法需要知道。
首先,一個控制項isFocusable()需要為true才有資格可以獲取到焦點。如果想要在觸摸模式下獲取焦點,需要通過setFocusableInTouchMode(boolean)來設置。也可以直接在xml布局文件中指定:
keyEvent 分發過程:
而當按下遙控器的按鍵時,會產生一個按鍵事件,就是KeyEvent,包含「上」,「下」,「左」,「右」,「返回」,「確定」等指令。焦點的處理就在KeyEvent的分發當中完成。
首先,KeyEvent會流轉到ViewRootImpl中開始進行處理,具體方法是內部類 ViewPostImeInputStage 中的 processKeyEvent :
接下來先看一下KeyEvent在view框架中的分發:
這里也是可以做焦點控制,最好是在 event.getAction() == KeyEvent.ACTION_DOWN 進行.
因為android 的 ViewRootlmpl 的 processKeyEvent 焦點搜索與請求的地方 進行了判斷if (event.getAction() == KeyEvent.ACTION_DOWN)
• 首先ViewGroup會一層一層往上執行父類的dispatchKeyEvent方法,如果返回true那麼父類的dispatchKeyEvent方法就會返回true,也就代表父類消費了該焦點事件,那麼焦點事件自然就不會往下進行分發。
• 然後ViewGroup會判斷mFocused這個view是否為空,如果為空就會return false,焦點繼續往下傳遞;如果不為空,那就會return mFocused的dispatchKeyEvent方法返回的結果。這個mFocused其實是ViewGroup中當前獲取焦點的子View
發現執行了onKeyListener中的onKey方法,如果onKey方法返回true,那麼dispatchKeyEvent方法也會返回true
如果想要修改ViewGroup焦點事件的分發
• 重寫view的dispatchKeyEvent方法
• 給某個子view設置onKeyListener監聽
下面再來看一下如果一個頁面第一次進入,系統是如何確定焦點是定位在哪個view上的
由於DecorView繼承自FrameLayout,這里調用的是ViewGroup的requestFocus
descendantFocusability:
• FOCUS_AFTER_DESCENDANTS:先分發給Child View進行處理,如果所有的Child View都沒有處理,則自己再處理
• FOCUS_BEFORE_DESCENDANTS:ViewGroup先對焦點進行處理,如果沒有處理則分發給child View進行處理
• FOCUS_BLOCK_DESCENDANTS:ViewGroup本身進行處理,不管是否處理成功,都不會分發給ChildView進行處理
因為 PhoneWindow 給 DecoreView 初始化時設置 了 setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS),所以這里默認是FOCUS_AFTER_DESCENDANTS
到此第一次請求焦點的過程基本告一個段落
焦點移動的時候,默認的情況下,會按照一種演算法去找在指定移動方向上最近的鄰居。在一些情況下,焦點的移動可能跟開發者的意圖不符,這時開發者可以在布局文件中使用下面這些XML屬性來指定下一個焦點對象:
在KeyEvent分發中已經知道如果分發過程中event沒有被消耗,就會根據方向搜索以及請求焦點View
流程一:查找用戶指定的下一個焦點
流程二:獲取搜索方向上所有可以獲取焦點的view,使用演算法查找下一個view
addFocusables() 獲取搜索方向上可獲得焦點的view
descendantFocusability屬性決定了ViewGroup和其子view的聚焦優先順序
• FOCUS_BLOCK_DESCENDANTS:viewgroup會覆蓋子類控制項而直接獲得焦點
• FOCUS_BEFORE_DESCENDANTS:viewgroup會覆蓋子類控制項而直接獲得焦點
• FOCUS_AFTER_DESCENDANTS:viewgroup只有當其子類控制項不需要獲取焦點時才獲取焦點
addFocusables 的第一個參數views是由root決定的。在ViewGroup的focusSearch方法中傳進來的root是DecorView,也可以主動調用FocusFinder的findNextFocus方法,在指定的ViewGroup中查找焦點。
FocusFinder.findNextFocus 查找焦點
『捌』 android 如何獲取一個界面最頂層的view並處理單擊事件的分發機制
android事件分發機制 就是一個觸摸事件發生了,從一個窗口傳遞到一個視圖,再傳遞到另外一個視圖,最後被消費的過程,在android中還是比較復雜的傳遞流程如下:
(1) 事件從Activity.dispatchTouchEvent()開始傳遞,只要沒有被停止或攔截,從最上層的View(ViewGroup)開始一直往下(子View)傳遞。子View可以通過onTouchEvent()對事件進行處理。
(2) 事件由父View(ViewGroup)傳遞給子View,ViewGroup可以通過onInterceptTouchEvent()對事件做攔截,停止其往下傳遞。
『玖』 android基礎-viewgroup的測量,布局,繪制
相關文章
android基礎-view的測量,布局,繪制
viewgroup的作用主要用於管理子view,而在測量的時候可以分兩種情況
關於viewgroup遍歷子view去慧胡測量的方法,android中已經幫我們封裝了兩個常用方法:
protected void measureChildren(int widthMeasureSpec, int heightMeasureSpec)
protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed, int parentHeightMeasureSpec, int heightUsed)
從方法名和方法裡面不難看出這兩個方法的區別,就是後者把子view的padding和margin也考慮了進去,不過他們最終調用的都是子view的 view.measure(int wSpec,int hSpec) 方法該方法回觸發子view的 onMeasure 方法
最後在測量子view之後,就要對自身大小做決定了,同樣是根據不同的測量模式來確定最終的大小,並且最後需要調用
protected final void setMeasuredDimension(int measuredWidth, int measuredHeight)
該方法來設置viewgroup的寬高
viewgroup的測量栗子如下:
在自定義viewgroup的時候,我前埋攔們必須重寫如下方法:
該方法主要就是通知子view去設置他們的布局位置,之前 android基礎-view的測量,布局,繪制 的篇章也已經詳細說明了view.layout方法的過程
viewgroup通知情況下不需要繪制,因為他本身就沒有需要繪制的東西,如果不是指定了viewgroup的背景色,那麼viewgroup的onDraw方法都不會被調用。但是,viewgroup會使用dispatchDraw()方法來繪制其子view,其過程同樣是通過變遍歷所有的子view,並調用子view的繪制方法來完成繪制工作
注意對於viewgroup而言onDraw()先於dispatchDraw()執行,用於本身控制項的繪制,dispatchDraw()用於子控制項的繪制,所以如果想對於viewgroup中繪制完子view之後在對其修改,我們可以在dispatchDraw調用surper方法之前做自己想要的繪制效果,這樣避免了被子view的覆蓋
viewgroup的測量,布局,繪制,其實都只是用來管理和通知子液鎮view去具體實現,可能最主要就是onLayout方法去定義子view的顯示位置,其他的核心都是在view中做處理的,所以先理解清楚view的顯示過程,那麼再來理解viewgroup的顯示過程,就會容易理解許多
《Android群英傳》¬
『拾』 Android問題 ,取得View中的控制項
你在寫Listview的adapter的getview返回的應該是一個包括一張帶洞ImageView和一個ProgressBar,的ViewGroup,不管你是用LinearLayout還則隱是其他的layout,總之是個ViewGroup;
你在另個一Activity中,取到ListView裡面的View,實際上就是個ViewGroup,可以把這個view強轉成ViewGroup對象,再通過getChildAt(0),getChildAt(1),分別取得的子view就是ImageView和蠢盯枯ProgressBar。