Android總結筆記05:Activity的切換方式(從底部彈出,退出時從頂部滑出)

我們都知道Activity默認的切換方式都是左右切換的,下面我們就來學習一下上下式切換的activity.廢話不多說,先上圖,無圖無真相。以下分別是原始狀態和activity彈出狀態。

 

一、下面說一下實現思路,當然這個切換方式有好多種實現方式,我這裏就說我長用的一種方式,其它方式有興趣的朋友們可以息行研究一下。我們可以用activity的樣式來控制activity的切換樣式。

1、用上下滑動的動畫。2、Activity的樣式是作爲一個dialog滑動上來的。3、要在mainfest文件中配置要彈出activity的樣式。4、在要彈出activity中設置而已參數。

二、實現代碼:

1、包結構:


2、主Activity--> MainActivity.java

package com.jun.activityslidetop;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		Log.d("fuck:", "Main:===onCreate") ;
		
		findViewById(R.id.mybtn).setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
			
				Intent intent = new Intent(MainActivity.this,Second.class) ;
				startActivity(intent) ;
			}
		}) ;
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	
	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
		super.onRestart();
		
		Log.d("fuck:", "Main:===onRestart") ;
	}
	
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		
		Log.d("fuck:", "Main:===onResume") ;
	}
	
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		
		Log.d("fuck:", "Main:===onStop") ;
	}
	
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.d("fuck:", "Main:===onDestroy") ;
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		
		Log.d("fuck:", "Main:===onPause") ;
	}
}

MainActivity.java只是一個普通的Activity,沒有什麼難點,只不過我在這裏實現了activity的生命週期,爲了就是顯示彈出activity的時候會調用什麼生命週期,咱們在開發中可以注意一下。

3、要彈出的Activity-->Second.java

package com.jun.activityslidetop;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup.LayoutParams;

public class Second extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		super.setContentView(R.layout.second) ;
		//注意這裏要有這句話,不然彈出的佈局不是理想中的。
		getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);

		
		this.findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View arg0) {
				finish() ;	
			}
		}) ;
	}
	
}

這個activity也沒有什麼特別的,只是一個設置佈局參數和返回按鈕事件的處理。當然想要彈出肯定不是這樣的,這樣的和普通的activity的切換方式有什麼區別呢。

4、下面就要看真正的activity的模式了這裏是決定activity切換的重點。res/styles.xml

<resources>

    <!--
        Base application theme, dependent on API level. This theme is replaced
        by AppBaseTheme from res/values-vXX/styles.xml on newer devices.
    -->
    <style name="AppBaseTheme" parent="android:Theme.Light">
        <!--
            Theme customizations available in newer API levels can go in
            res/values-vXX/styles.xml, while customizations related to
            backward-compatibility can go here.
        -->
    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
        <!-- All customizations that are NOT specific to a particular API-level can go here. -->
    </style>

   
   <!-- 以下的解決了彈出彈入的問題  -->
   <style name="popup_dialog_anim" parent="@style/popup_dialog">
        <item name="android:windowAnimationStyle">@style/dialog_animations</item>
    </style>

    <style name="popup_dialog" parent="@android:style/Theme.Dialog">
    
        <item name="android:windowFrame">@null</item> 	 	<!--Dialog的windowFrame框爲無  -->
        <item name="android:windowIsFloating">true</item>	<!-- 是否浮現在activity之上 -->
        <item name="android:windowIsTranslucent">true</item><!-- 是否半透明 -->
        <item name="android:windowNoTitle">true</item>		<!-- 是否顯示title -->
        <item name="android:background">@android:color/transparent</item>
        <item name="android:windowBackground">@android:color/transparent</item> <!-- 設置dialog的背景 -->
        <item name="android:backgroundDimEnabled">true</item>					<!-- 背景是否模糊顯示 -->
        <item name="android:backgroundDimAmount">0.6</item>
    </style>

    <style name="dialog_animations">
        <item name="android:windowEnterAnimation">@anim/slide_in_from_bottom</item> <!-- 從下面彈出時的動畫 -->
        <item name="android:windowExitAnimation">@anim/slide_out_from_bottom</item> <!-- 從上面下滑到底部時的動畫 -->
    </style>
 <!--  -->
     
  
</resources>


以上的xml註釋很詳細不用多說,下面看一下彈出和離開的動畫。在res/anim目錄下。


(1)、slide_in_from_bottom.xml(從底部彈出的動畫)

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromXDelta="0.0%"
    android:fromYDelta="100.0%"
    android:toXDelta="0.0%"
    android:toYDelta="0.0%" />

(2)、slide_out_from_bottom.xml(從頂部滑出的動畫)

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromXDelta="0.0%"
    android:fromYDelta="0.0%"
    android:toXDelta="0.0%"
    android:toYDelta="100.0%" />

5、最後別忘了在mainfext.xml中需要彈出的activity上設置上所定義的樣式即可如:Second是彈出式的那就如下設置。

 <activity android:name=".Second" android:theme="@style/popup_dialog_anim"
            android:configChanges="keyboardHidden|orientation"></activity>

注意:這裏有兩點值得得注意,第一:就是要在mainfest中設置需要彈出的activity的樣式,第二是:要在彈出的activity的setcontent()後面寫上設置佈局參數的代碼getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);不然佈局加載出來有問題,你可以試一試去年這一行。

三、由於彈出的activity是dialog樣式的,所以當我們離開second.java時調用MainActivity中的onPuase()方法,再次彈出時調用onResume()方法。和普通的activity不太一樣。這裏說明一點Dialog樣式的activity和Dialog是不一樣的,如果我們彈出一個dialog的話,什麼生命週期方法都不會調用的,除非你的dialog上面有處理activity的邏輯(比如點擊確認按鍵打開一個新的activity)。

好了今天的內容就到這裏了,如果朋友們有什麼好的建議和意見都提出來我們一同進步。

最後附上源碼下載地址:http://download.csdn.net/detail/android0012345/6461065


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章