ViewStub 與 setTranslationX

開發(fā)過程中有個地方使用了ViewStub,但是發(fā)現(xiàn)ViewStub調(diào)用setTranslationX之后并沒有任何反應(yīng),經(jīng)過一番實驗,發(fā)現(xiàn)使用inflate獲取了View之后,再對View使用setTranslationX才會有效果

public class ViewStubTestActivity extends Activity {

 ViewStub sb1;
 ViewStub sb2;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main_viewstub);
  sb1 = (ViewStub) findViewById(R.id.stub_1);
  sb2 = (ViewStub) findViewById(R.id.stub_2);
  // sb1.setVisibility(View.VISIBLE); // 或者使用sb1.inflate()
  // sb1.setTranslationX(100); // 然后這個并沒有效果
  sb1.inflate().setTranslationX(100); // 這個才有效
 }
}

簡單讀了一下源碼,發(fā)現(xiàn)ViewStub在實例化具體內(nèi)容的時候,把自己給移除了,同時將具體內(nèi)容作為一個引用存了下來。而不是自身轉(zhuǎn)換為目標(biāo),也不是自己將目標(biāo)作為自身的子view。

所以我們應(yīng)該去用這個mInflatedViewRef所指代的View
而不是用ViewStub本身。

貼一段源碼。


  /**
     * Inflates the layout resource identified by {@link #getLayoutResource()}
     * and replaces this StubbedView in its parent by the inflated layout resource.
     *
     * @return The inflated layout resource.
     *
     */
    public View inflate() {
        final ViewParent viewParent = getParent();

        if (viewParent != null && viewParent instanceof ViewGroup) {
            if (mLayoutResource != 0) {
                final ViewGroup parent = (ViewGroup) viewParent;
                final LayoutInflater factory;
                if (mInflater != null) {
                    factory = mInflater;
                } else {
                    factory = LayoutInflater.from(mContext);
                }
                final View view = factory.inflate(mLayoutResource, parent,
                        false);

                if (mInflatedId != NO_ID) {
                    view.setId(mInflatedId);
                }

                final int index = parent.indexOfChild(this);
                parent.removeViewInLayout(this);

                final ViewGroup.LayoutParams layoutParams = getLayoutParams();
                if (layoutParams != null) {
                    parent.addView(view, index, layoutParams);
                } else {
                    parent.addView(view, index);
                }

                mInflatedViewRef = new WeakReference<View>(view);

                if (mInflateListener != null) {
                    mInflateListener.onInflate(this, view);
                }

                return view;
            } else {
                throw new IllegalArgumentException("ViewStub must have a valid layoutResource");
            }
        } else {
            throw new IllegalStateException("ViewStub must have a non-null ViewGroup viewParent");
        }
}

以上。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,057評論 25 709
  • 作者:李旺成 時間:2016年5月7日 該 Hack 將介紹如何使用 ViewStub 實現(xiàn)視圖的延遲加載(懶加載...
    diygreen閱讀 1,238評論 1 43
  • 太長不看版:在 Android UI 布局過程中,遵守一些慣用、有效的布局原則,可以制作出高效且復(fù)用性高的 UI。...
    Mupceet閱讀 4,026評論 0 14
  • 在學(xué)習(xí)領(lǐng)域,“知乎”,是一個神一樣的存在,包括羅輯思維的眾多橋段,也來自于知乎。你能看到很多大神在上面回答問題,但...
    十點洞見閱讀 1,967評論 0 0
  • Chart.js 創(chuàng)建Chart.js 創(chuàng)建折線圖 創(chuàng)建柱狀圖 雷達圖 極地區(qū)域圖 餅狀圖與環(huán)形圖 氣泡圖 設(shè)置圖...
    greenteaObject閱讀 2,987評論 1 2

友情鏈接更多精彩內(nèi)容