2012-12-12 65 views
10

我的應用程序有一個網頁視圖和LinerLayout裏面的一些按鈕。的方向改變替換佈局

的問題是,我想要的按鈕上在縱向模式下底部和左側橫向模式而維持的WebView它的狀態。因爲它強制將刷新網頁視圖活動的娛樂

兩個不同的佈局不起作用。現在我用的android :在活動標籤configChanges =「方向」這樣的WebView不會得到方向改變刷新。

反正是有更換的屏幕模式改變按鈕的佈局?

enter image description here

肖像模式

enter image description here

風景模式

回答

9

我測試了片段,但處理片段使事情變得更加複雜,片段本身需要保存和恢復,這可能無法在具有javascript狀態的webview中工作,所以我搜索了更多,並找到一個不錯的文章的地方,並進行一些修改我來到了一個解決方案,我建議:

首先,添加android:configChanges="orientation|screenSize|keyboard|keyboardHidden"因此應用程序處理配置的變化,而不是機器人。

作出橫向和縱向兩種不同的佈局。在兩種佈局而不是網頁視圖地方它充當web視圖一個佔位符的FrameLayout。

定義initUI方法這樣,把一切在這個方法中的有關UI初始化:

public void initui() 
{ 
    setContentView(R.layout.main); 
    if (wv == null) wv = new WebView(this); 
    ((LinearLayout)findViewById(R.id.webviewPlace)).addView(wv); 
    findViewById(R.id.home).setOnClickListener(this); 
} 

如果網頁流量不存在,但它會被創建和setContentView(R.layout.main)後它會被添加到佈局。在此之後,您需要的任何其他UI自定義。

onConfigurationChanged

@Override 
public void onConfigurationChanged(Configuration newConfig) 
{ 
    ((LinearLayout)findViewById(R.id.webviewPlace)).removeAllViews(); 
    super.onConfigurationChanged(newConfig); 
    initUI(); 
} 

onConfigChange web視圖從舊佔位符刪除,initui將被調用,將其重新添加到新的佈局。

oncreate()呼叫initui()所以用戶界面將會被初始化首次。

public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    initUI() 
} 

我希望這會對某人有所幫助。

5

把這點layout-land的佈局,你想要的景觀。

的想法是,你真的不應該使用configChange="orientation",因爲它有它的缺點。你可以找到詳細的帖子here。如果你想改變你的佈局,你應該手動處理你的狀態。當然,你可以編程,但如果你想用xml來做到這一點。你可以用碎片維護你的webView。

+1

我說,那是行不通的。它重新創建視圖並刷新web視圖。 android:configChanges =「orientation」可以防止這種行爲。 – Ali

+1

我閱讀了關於碎片的內容,但不知道它是如何工作的!它在Android 2.2中工作? – Ali

+0

使用supportv4庫,是的。在許多現實生活中應用片段被使用。它取決於你什麼時候瞭解它。另一種解決方案將幫助你,它不需要碎片。但是如果您想了解片段,可以在NewProject> MasterDetailedFlow或Viewpager模板中看到該模板。 – wtsang02

1

讓你的看法相對佈局。當方向改變時,只需調整代碼中每個視圖的佈局參數。 有你的按鈕包含在一個線性佈局

如..

肖像

LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT); 
lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); 
buttonLinearLayout.setOrientation(LinearLayout.HORIZONTAL); 
buttonLinearLayout.setLayoutParams(lp); 


LayoutParams webParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
lp.addRule(RelativeLayout.ABOVE, R.id.buttons); 
webView.setLayoutParams(webParams); 

景觀

LayoutParams lp = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT); 
lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
buttonLinearLayout.setOrientation(LinearLayout.VERTICAL); 
buttonLinearLayout.setLayoutParams(lp); 


LayoutParams webParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); 
lp.addRule(RelativeLayout.TO_RIGHT_OF, R.id.buttons); 
webView.setLayoutParams(webParams); 

確保您使用的LayoutParams是RelativeLayout參數(總是使用Layoutparams的視圖的父)

4

嘗試使用此代碼:

@Override 
    public void onConfigurationChanged(Configuration newConfig) { 
     super.onConfigurationChanged(newConfig); 
     setContentView(R.layout.activity_splash); 
    } 
+0

美麗!!!!!! THKS –

4

,它忽略了「佈局土地」的XML。如果您創建一個不同的XML景觀不使用android:configChanges="orientation|screenSize"標籤中體現這一活動。