2011-11-27 107 views
3

正如我其實不是很自信編程改變意見,我有以下問題:如何使用LayoutInflater/ViewStub用於覆蓋

在我的應用程序的第一個開始,我希望有主的覆蓋屏幕,它告訴用戶查看設置,因爲用戶必須配置兩個關鍵選項。我不想使用AlertDialog,而不使用嚮導。所以,我決定採取類似於Go SMS的方法,並在第一次啓動時創建覆蓋。我創建的實體模型看起來是這樣的:

普通菜單: Normal

先啓動: enter image description here

因此,這些都是問題,我有:

  1. 就像我說的,我不不想在首次啓動時使用重疊的屏幕截圖,因爲這會佔用太多空間,並且不會獨立於語言和屏幕。
  2. 我會圓爲PNG,但我不知道究竟是如何把它放在圖像
  3. 與文本同樣的問題
  4. 最後我想提出在一個半透明的白色應用程序。它不一定需要圖標的孔,但它會很好。

如果你需要的佈局源,你可以在pastebin

所以得到它,我只需要在這裏得到一個開始,如果它是更好地使用LayoutInflater或ViewStub以及如何去實現它,因爲我絕對沒有經驗...

謝謝!

/編輯:我上傳了一個新的,佈局更合理的佈局。

回答

1

我遇到過類似的問題,我的客戶想要一個應用程序的漫遊,整個屏幕必須變得更白(如他們所說:「透明」),除了按鈕被解釋一個重疊的講話泡泡。
幸運的是,您的佈局並不像我不得不使用的那樣複雜:)

現在,您可以通過兩種方式獲得透明效果,可以有白色背景並調用所有視圖setAlpha()方法,或者你可以創建一個半透明的白色覆蓋。
如果您使用疊加層,則必須找到一種方法來顯示疊加層中的不透明按鈕。這可能會有點複雜。 如果使用第一個選項,您可以在不透明視圖上設置Alpha(1)以使其顯示出來。

setAlpha()方法僅適用於api版本11+,因此如果您定位的是早期版本,則可能需要稍微更復雜一些。在視圖上設置阿爾法預蜂窩
例子:

佈局的按鈕(讓他們不過你想要的,只是讓他們相似的,所以你可以通過它們循環):

<LinearLayout 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 
    <ImageView 
     android:tag="image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/tile"/> 
    <TextView 
     android:tag="text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="#FF000000" 
     android:text="button1"/> 
</LinearLayout> 

在你程序,當你想使按鈕透明:

LinearLayout l = (LinearLayout) findViewById(R.id.button1); 
((ImageView)l.findViewWithTag("image")).setAlpha(0x7F); 
((TextView)l.findViewWithTag("text")).setTextColor(0x7F000000); 



當你^ h ave決定如何創建透明度效果,您將不得不決定如何顯示疊加文本/泡泡。您很可能希望將其放在整個佈局頂部的單獨圖層中,以確保它不受新視圖的影響。
實現此目的的一種方法是將您的根佈局元素更改爲FrameLayout,然後在此創建/顯示。 e.g:

​​

當顯示的介紹,您可以設置隱藏的疊加視圖表項目的位置的位置加以解釋,文本更改爲適當的串/資源並顯示視圖。

當介紹結束時,您重置所有按鈕的alpha值,並將覆蓋層的可見性設置爲再次消失。

+0

非常感謝您的回答!但是,我以某種方式沒有得到代碼的工作。你可以提供一些示例代碼? (你不必爲我寫整個東西) – Force

+0

我添加了一些代碼來改變按鈕的透明度,因爲我意識到setAlpha()只存在於蜂窩中。我會隨時更新一些示例代碼。 – Jave

+0

謝謝,現在它工作完美! :) – Force

0

由於我沒有太多的ViewStub經驗,我會用LayoutInflater來做。

首先,您需要在當前佈局的頂部加載第二個佈局。最簡單的方法是創建一個FrameLayout,它將當前的視圖作爲一個孩子,並且在第一次啓動時動態地加載第二個孩子。當你在一個Activity中加載一個內容視圖時,它將被附加到一些已經創建的視圖(一些DecorView,一個FrameLayout等等)。因此,您可以重新使用現有的FrameLayout,也可以創建一個新的FrameLayout。 我會爲第二個解決方案投票,因爲它更穩定(我只是提到了其他可能性,以防止您想要最小化層數)。因此,作爲第一步,將當前佈局包裝在FrameLayout中,併爲其指定一個ID,比如說「@ id/root」。

然後,在onCreate方法,你可以有這樣的事情:

setContentView(R.layout.main); 
if (isFirstRun()) { 
    ViewGroup parent = (ViewGroup)findViewById(R.id.root); // locate the FrameLayout 
    LayoutInflater li = LayoutInflater.from(this); // get an instance of LayoutInflater 
    li.inflate(R.layout.overlay, parent); 
} 

到目前爲止,您將有覆蓋加載。現在由您來定義覆蓋層。 爲了增強美白效果,只需在疊加層的根視圖上設置以下屬性即可。xml佈局:

android:background="#40ffffff" 

要定位圓,首先您需要找到它的位置。您可以使用View.getLocationOnScreen獲取屏幕上圖標的絕對座標(圓圈下方)。然後,你可以有兩種選擇:

  • 可以創建一個自定義視圖(覆蓋)和手動繪製圓在給定位置
  • 或使用的ImageView加圈,並據此調整左側和頂部邊緣在座標上
+0

感謝您的回答,但是我沒有得到LayoutInflater部分的工作。無論我做什麼或我使用什麼佈局,它只是不顯示任何東西... – Force

+0

你可以嘗試從其他答案(即在默認佈局中包含覆蓋佈局,但默認情況下隱藏)或使用hierarchyviewer來重新檢查層次結構(可能是因爲某種原因添加了,但不可見) –

+0

我將在其他答案上工作 - 但是我真的很喜歡讓這個工作。因爲,LayoutInflater一定有問題,我也嘗試過'LayoutInflater li =(LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);',但是這也行不通... – Force