導航:首頁 > 操作系統 > androidstackview

androidstackview

發布時間:2022-11-26 19:48:49

android StackView 怎麼設置只顯示3個item

是否點擊的標志僅需要存儲1個positio就夠了
因為這是同時也只會有一個隱藏並且隱藏之後也無法點擊了只能點擊未隱藏的所以要實現這個功能只需要
2個注意的點:

1 定義一個全局變數用來存儲需要隱藏的item的position

2 給listview設置一個點擊監聽setonitemclickListener

getview裡面做一個判斷如果當前position等於存儲得position隱藏掉這個view

當點擊了listview 更新一下全局變數並且調用notifydatachanged刷新一下adapter

Ⅱ android 自定義通知欄

Notification 參數使用 參考:
http://www.cnblogs.com/kexing/p/8371051.html

自定義通知欄
僅支持FrameLayout、LinearLayout、RelativeLayout三種布局控制項
AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper這些顯示控制項
否則會引起ClassNotFoundException異常。

流程:點擊通知欄 發送廣播 app接收廣播做相應處理:

為通知欄綁定廣播事件:

1.FLAG_CANCEL_CURRENT:如果AlarmManager管理的PendingIntent已經存在,那麼將會取消當前的PendingIntent,從而創建一個新的PendingIntent.
2.FLAG_UPDATE_CURRENT:如果AlarmManager管理的PendingIntent已經存在,讓新的Intent更新之前Intent對象數據,例如更新Intent中的Extras,另外,我們也可以在PendingIntent的原進程中調用PendingIntent的cancel ()把其從系統中移除掉
3.FLAG_NO_CREATE:如果AlarmManager管理的PendingIntent已經存在,那麼將不進行任何操作,直接返回已經.
4.FLAG_ONE_SHOT:該PendingIntent只作用一次.在該PendingIntent對象通過send()方法觸發過後,PendingIntent將自動調用cancel()進行銷毀,那麼如果你再調用send()方法的話,系統將會返回一個SendIntentException.

添加廣播接收:

AndroidManifest:

Ⅲ 為什麼柵格系統以8為基數好處有哪些

之前寫過一個關於 柵格系統 的簡述文章;現在來看只能作為簡單的視覺布局參考,更多的是從排版布局的角度出發。最近被問到選擇幾作為柵格基數比較好這個問題,對此做一下整理。

其實柵格在各個平台開發布局中都有所定義。

通俗介紹 簡單了解一下開發布局中柵格的變革

Web端最常見的布局 Bootstrap  ;

它是Twitter的設計師Mark Otto和Jacob Thornton合作開發的一款強大的前端框架,至今仍被廣泛使用,已經更新到V4版本了。

Bootstrap 中的柵格系統是一套響應式、移動設備優先的瀑布流式柵格系統。

它將系統分為12列,當然也可以通過變數來改變列數和列寬,水槽寬度,屏幕浮動寬度;

其實設置屏幕浮動寬度就是我們看到的屏幕自適應,就是根據屏幕寬度來選擇顯示參數。

Bootstrap 中的柵格流只能作為大的布局定義,那麼針對最小單位是該用8、10、15還是多少也是需要根據需求去做分析。

iOS布局方式很多,常用的可以歸納為 Frame、Autoresizing、Constraint、StackView 和 Masonry  五種;

其中,

Frame 用來描述UIView的位置和大小;

Autoresizing 早期用來適配屏幕;

Constraint 比 Autoresizing 更加靈活,適配效果更好;

了解一下,

StackView  它是iOS9時新增的一個視圖類,可以把它理解成一個容器,添加到容器內的控制項可以按照行或列進行布局。

Masonry  是一個輕量級的布局框架,是基於 NSLayoutConstraint 的一種第三方框架;通俗來講用它實現適配布局更簡潔更輕量。

先簡單了解一下Android開發中的六大基本布局

LinearLayout  線性布局:最常用的以垂直和水平方向的布局方式

RelativeLayout  相對布局:可以基於父或兄弟控制項來布局

FrameLayout  層布局:就是控制項蓋控制項的那種布局方式

AbsoluteLayout  絕對布局:基於絕對坐標xy布局,無法自適應

了解一下,

TableLayout  表格布局:多行多列的布局方式

GridLayout  網格布局:以網格的方式進行布局

在引入的表格布局和網格布局中其實就是為了更加方便系統柵格化

根據以上內容對於三大平台的常用布局做一個簡單的分析

總結:

Web端引入的Bootstrap、Android端的表格和網格布局以及iOS9之後引入的Stachview和Masonry都是為了能更好的適配以及進行系統的柵格布局;

也體現了設計中需要柵格定義的重要性。

以上布局框架僅是從開發層面的一個布局演變

看到過很多關於柵格布局的文章,現在理解覺得有些片面,可能僅是作為從設計的角度去理解, 很多的柵格方式都是從平面排版設計中的柵格演變過來的,基數可能比較隨性,並且沒有嚴格貼合系統去做。

站在巨人的肩膀上,還是從這三大平台來看,看一下官方給出的建議。

簡單看一下Bootstrap的柵格參數, 通過下表可以詳細查看 Bootstrap 的柵格系統是如何在多種屏幕設備上工作的。

由表知Bootstrap的默認水槽寬度是30px(每列左右是15px),當然這些是可自定義的,Bootstrap的主要目的是為了適配屏幕進行自適應布局;

我們設計時設置柵格的時候大多數情況下是以非自適應網頁來做的柵格,柵格最小單位一般是10,15等不定參數;

雖然Web端的可視范圍比較大瀏覽方式和移動端不一樣,

但是我們發現針對一些內容較多的網頁或者說對卡片內的信息去做布局,基數是10或15就會很難呈現出想要的效果。

以8為基數的柵格系統漸漸被使用,以8為基數  好在哪裡?

之前國外的一個博客中( spec.fm  *一個開發者和設計師共同搭建的博客,設計細節中會從多個緯度去考量), 有 一篇文章  提到過使用8點柵格的好處。

總結一下他們在Web端分析出的好處點有哪些;

Bootstrap或其他的框架只作為一個大的布局系統,對於設計 沒有一個設計單位去衡量 排版很難一致性,使用8點的好處在哪:

對於設計: 效率, 減少決策 ,同時能 保持元素之間的節奏 。

對於團隊: 開發人員 更容易理解 ,在開發眼裡8更有說服性。

對於用戶: 一致審美 ,減少設備上出現模糊的 半像素偏移 問題。

我們來看iOS的  Human Interface Guidelines  如何去給出布局建議。

iOS是個封閉的系統,在  Human Interface Guidelines  可以看到iOS使用Auto Layout自動布局,iOS的系統完全自主更新,終端設備也完全由自己決定,因此系統可以做到強制規范化。但在這里提到的基數也是  8  。

在布局中說到的約束,就是我們來定義的柵格基數,他給的建議也是  8  。

下邊我們找一下iOS官方組件,看一下自適應布局的限制區域是不是基數  8  。

在Sketch中置入一個iOS官方頁面組件將其拆解:

其實我們發現在iOS系統設計中的基數也是以8為基準。

上邊說到的 Spec.fm 中的那篇文章中有提到Points,關於iOS的@1x,@2x,@3x圖,用 8 為基數可減少出現是奇數造成一像素偏移模糊的情況。

Android端的  Material Design  布局給出的建議。

在 Material Design 給出的建議中是以8dp為基準,小的控制項以4dp為基準。

Material Design 定義的柵格布局更像Bootstrap,它可以適應多平台,結合它豐富的視覺語言能搭建出更加嚴謹的移動應用或網頁。

站在巨人的肩膀上

從以上三大平台來看,移動端官方給出的建議都是以8為基準。

從以上分析 我個人覺得,

從系統的角度,首先要保證是偶數;只研究移動端平台: 2、4、6、8、10 ;

其實 我覺得用2的次方計算會更加貼合: 2^1、2^2、2^3、2^4 :  2、4、8、16 ;

在這些數字中2作為基數太小了我們視覺能看到的2個點太小,並且使用起來很麻煩每次都要進行計算;

那麼10或16作為基數又太大了,在移動端很難避免信息過多小屏幕需要考慮排版的問題;

取在這兩組數中的交集還剩下 4 和 8 ;

以上Material Design給出的建議中也是以8為基準,小的控制項以4為基準。

從很多角度來看 8 點柵格是最為理想的柵格基礎單位

下面再總結一下8點柵格的好處:

1、Web端布局更加靈活。

2、視覺一致性,保證元素之間的節奏。

3、減少出現奇像素偏移造成模糊。

4、開發更容易理解的數字8。

5、能被最多的屏幕尺寸整除適配,這也是Material Design和iOS建議的主要原因之一。

END / THX

Ⅳ 如何在Android實現桌面清理內存簡單Widget小控制項

一、UI部分的編寫:
參照Google的文檔,首先在建立一個類繼承 AppWidgetProvider
import android.appwidget.AppWidgetProvider;

public class MyWidget extends AppWidgetProvider {

}

然後在清單文件中申明它,我們必須注意到,AppWidgetProvider實際上是BroadcastReceiver,所以要注冊成一個receiver,然後還有一些其他的東西需要注意:
<receiver android:name="com.alexchen.widget.MyWidget" >
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>

<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/example_appwidget_info" />
</receiver>

android.appwidget.action.APPWIDGET_UPDATE
表明這個receiver能夠接受一個APPWIDGET_UPDATE的廣播,而且在這里,只能加入這一個action。
android.appwidget.provider 表明數據類型時widget提供者提供的數據,example_appwidget_info 表明這個widget的參數配置文件名和位置
那麼接下來就需要在res目錄下建立一個xml文件夾,並且在其中建立一個example_appwidget_info.xml 的配置文件,Google的文檔中給出了示例有很多參數,實際上關鍵的參數只有下面的4個:
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
android:minWidth="94dp"
android:minHeight="72dp"
android:updatePeriodMillis="86400000"
android:initialLayout="@layout/example_appwidget">
</appwidget-provider>

其中, minWidth 和 minHeight 代表這個widget控制項所佔據的最小空間,這個空間一般來講不需要太大,因為太大的話,一個屏幕可能都沒辦法放下,Google的官方文檔的說法是大於4x4的就可能無法顯示。
updatePeriodMillis 代表數據更新的時間,這里86400000毫秒實際上是24小時,可能最開始看到這個參數會想我能否將其設的很小,每一秒刷新很多次?, 實際上對於updatePeriodMillis 這個參數而言, 即算你設的再小也沒用,Google設定widget控制項這個參數控制的最短update時間為30分鍾,就算將其設置在30分鍾以內也會以30分鍾的頻率來更新數據。
initialLayout 參數代表的是本widget空間的布局文件。
那麼下一步就是定義出一個對應的布局文件。我們可以簡單的在layout目錄下建立一個布局文件example_appwidget.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="200dp"
android:layout_height="80dp"
android:background="@android:color/white"
android:gravity="center_vertical"
android:orientation="vertical" >

<TextView
android:id="@+id/tv_widget"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="widget控制項測試"
android:textColor="@android:color/black"
android:textSize="15sp" />

<Button
android:id="@+id/btn_clear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="清理內存"
android:textColor="#ff000000" />

</LinearLayout>

在Google的文檔中有指出,並非所有的布局組件都可以在上面的這個布局中生效,有效的組件或布局為:
FrameLayout
LinearLayout
RelativeLayout
GridLayout
AnalogClock
Button
Chronometer
ImageButton
ImageView
ProgressBar
TextView
ViewFlipper
ListView
GridView
StackView
AdapterViewFlipper
至此,一個簡單的widget控制項就寫好了,我們可以在模擬器上將其拖到桌面上看一看效果:

二、功能邏輯部分的實現
大部分的Widget小控制項都會需要在特定情況下更新上面顯示的數據,那麼這個是如何實現的呢,我們經過上面的代碼不難發現實際上這個widget控制項並沒有一個Activity,所以說這個控制項的顯示實際上不是本應用來實現的,它實際上是桌面這個應用來顯示的,所以我們也不可能直接去更新它上面的數據。
回過頭去看看上面我們寫的那個receiver,實際上沒有實現任何方法。實際上AppWidgetProvider裡面有幾個比較重要的方法: onReceive、 onUpdate、onDisabled、onEnabled
其中 onReceive 方法跟大多數廣播接收者的onReceive方法一樣,但是在這里,onReceive方法的調用並不是我們可以決定的, 它依賴於顯示該widget控制項的Host組件,在這里也就是Android桌面應用,所以我們會發現在不同的手機上,將widget控制項拖到桌面上顯示的時候onReceive可能調用的次數和先後順序可能完全不一樣,這依賴於Host組件是如何實現的。
所以在這里onReceive方法對於我們刷新widget數據基本沒有什麼幫助。
而 onUpdate 方法則是由上面所說的 updatePeriodMillis 參數來控制的,經過上面的分析,我們都知道了,它的最小周期為30分鍾。所以我們一般將這個參數設為0即可。那麼在這個方法里,我們往往會在其中放置一些啟動更新數據服務的功能,因為如果後台的更新數據的Service被意外停止了,那麼每30分鍾還會被重新啟用,不至於一直啟動不了了:
@Override
public void onUpdate(Context context, AppWidgetManager appWidgetManager,
int[] appWidgetIds) {
super.onUpdate(context, appWidgetManager, appWidgetIds);
// System.out.println("onUpdate");
//每隔一段時間重新啟動服務,防止服務中間被終止了之後沒法重啟
Intent intent = new Intent(context, UpdateWidgetService.class);
context.startService(intent);
}

下面是比較重要的兩個方法了:
onDisabled和onEnabled
我們知道,widget 小控制項是可 以拖動多個到桌面上的,而 onEnabled 方法會在第一個widget控制項拖到桌面上的時候調用一次, onDisabled 會在最後一個widget控制項從桌面被刪除時調用一次,那麼我們需要做的就是在 onEnabled 這個方法中啟用一個刷新widget數據的服務,在 onDisabled 方法中使用 stopService 方法來停止這個服務。
@Override
public void onDisabled(Context context) {
super.onDisabled(context);
System.out.println("onDisabled");
//停止數據刷新服務
Intent intent = new Intent(context, UpdateWidgetService.class);
context.stopService(intent);
}

@Override
public void onEnabled(Context context) {
super.onEnabled(context);
System.out.println("onEnabled");
//開啟數據刷新服務
Intent intent = new Intent(context, UpdateWidgetService.class);
context.startService(intent);
}

三、刷新數據的服務
那麼下面的任務就只剩下 UpdateWidgetService 這個刷新數據的服務(Service)如何實現的問題了。
我們在這里的想法很簡單,比如說每隔三秒鍾來刷新一下widget中的數據。Android中定時執行任務的方法有很多,我們這里使用 Timer 和 TimerTask 來實現,之後我們需要關心的就是具體如何實現刷新widget中的數據,畢竟這些數據是在桌面應用中顯示的。
並且我們需要用到一個API-- AppWidgetManager ,它有一個實例方法AppWidgetManager .updateAppWidget( ComponentName provider, RemoteViews views) 來實現更新widget數據,我們都知道,如果需要調用另外應用的方法,需要使用遠程調用的方法來實現,在這里起到在我們的應用和桌面應用之間的橋梁作用的就是這第二個參數:RemoteViews views, 它會將我們設置的數據傳送到桌面應用來刷新widget上的數據,我們需要經過下面幾步:
1、定義一個RemoteViews的實例:
RemoteViews views = new RemoteViews(getPackageName(),R.layout.process_widget);
2、設置views的內容,也就是刷新其中的數據,這里的方法名會比較奇怪,RemoteViews .setTextViewText( int viewId, CharSequence text)
其中viewId是在我們前面定義的widget布局文件中的子組件的id,也就是我們要刷新內容的對象,這里就是R.id.tv_test,第二個參數是我們要更新的內容
3、定義好第一個參數ComponentName provider 之後,就可以調用AppWidgetManager .updateAppWidget( ComponentName provider, RemoteViews views) 來實現更新數據
if (timer == null && task == null) {
//AppWidgetManager對象,用於更新widget的數據
awm = AppWidgetManager.getInstance(this);
timer = new Timer();
task = new TimerTask() {
@Override
public void run() {
ComponentName provider = new ComponentName(UpdateWidgetService.this, MyWidget.class);
//遠程view對象,用於在本應用和桌面應用中起傳遞數據的橋梁作用
RemoteViews views = new RemoteViews(getPackageName(),R.layout.example_appwidget);
views.setTextViewText(R.id.tv_widget, "想刷新的數據的內容");
awm.updateAppWidget(provider, views);
System.out.println("====刷新了widget====");
}
//設置循環時間
timer.schele(task, 0, 3000);
}

四、定時刷新可用內存和一鍵清理內存功能實現
要實現這個功能,我們需要再上面定時刷新數據服務中將定時刷新的內容改為當前內存所剩餘的量,我們這里寫一個工具類方法來實現返回內存剩餘量;
另外我們還需要在widget控制項的布局文件中添加一個button,並在更新widget數據的服務中,設置這個button的點擊事件,但是這里也不像以前的點擊事件,同樣要應用到RemoteView對象,在這個點擊事件中需要發送一個廣播,Action為自定義的,我們這里設為: "com.alexchen.mobilesafeexercise.killall" ,之後,我們需要再寫一個廣播接收者,來接收這個廣播,在onReceive方法中執行殺死後台進程的操作。這里也不能直接使用Intent,由於我們這個意圖的Action不是由我們自己執行而是由其他應用程序(桌面應用)執行的,所以需要用到 PendingIntent 。
刷新widget數據的服務代碼:
package com.alexchen.widget.service;

import java.util.Timer;
import java.util.TimerTask;

import android.app.PendingIntent;
import android.app.Service;
import android.appwidget.AppWidgetManager;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.text.format.Formatter;
import android.widget.RemoteViews;

import com.alexchen.widget.MyWidget;
import com.alexchen.widget.R;
import com.alexchen.widget.utils.SystemInfoUtils;

public class UpdateWidgetService extends Service {
private Timer timer;
private TimerTask task;
private AppWidgetManager awm;

@Override
public IBinder onBind(Intent intent) {
return null;
}

@Override
public void onCreate() {
super.onCreate();
startTimer();
}

private void startTimer() {
if (timer == null && task == null) {
awm = AppWidgetManager.getInstance(this);
timer = new Timer();
task = new TimerTask() {

@Override
public void run() {
ComponentName provider = new ComponentName(
UpdateWidgetService.this, MyWidget.class);
RemoteViews views = new RemoteViews(getPackageName(),
R.layout.example_appwidget);
views.setTextViewText(R.id.tv_widget, "dd");
views.setTextViewText(R.id.tv_widget,
"可用內存:"+ Formatter.formatFileSize(getApplicationContext(),
SystemInfoUtils.getAvailableMem(getApplicationContext())));
// 自定義一個廣播,殺死後台進程的事件
Intent intent = new Intent();
intent.setAction("com.alexchen.mobilesafeexercise.killall");

// 描述一個動作,這個動作是由另外一個應用程序執行的
PendingIntent pendingIntent = PendingIntent.getBroadcast(
getApplicationContext(), 0, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
views.setOnClickPendingIntent(R.id.btn_clear, pendingIntent);
awm.updateAppWidget(provider, views);
System.out.println("====刷新了widget====");
}
};
timer.schele(task, 0, 3000);
}
}
@Override
public void onDestroy() {
super.onDestroy();
stopTimer();
unregisterReceiver(offReceiver);
unregisterReceiver(onReceiver);
}

private void stopTimer() {
if (timer != null && task != null) {
timer.cancel();
task.cancel();
task = null;
timer = null;
}
}
}

按鍵清理內存的廣播接收者:
package com.alexchen.widget.receiver;

import java.util.List;

import android.app.ActivityManager;
import android.app.ActivityManager.RunningAppProcessInfo;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class KillAllReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
System.out.println("自定義的廣播消息接收到了...開始清理內存...");
ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runningAppProcesses = am
.getRunningAppProcesses();
for (RunningAppProcessInfo info : runningAppProcesses) {
am.killBackgroundProcesses(info.processName);
}
}
}

獲取可用內存的工具類方法:
/**
* 獲取手機可用的剩餘內存
*
* @param context
* 上下文
* @return
*/
public static long getAvailableMem(Context context) {
ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
MemoryInfo outInfo = new MemoryInfo();
am.getMemoryInfo(outInfo);
return outInfo.availMem;
}

Ⅳ android stackview是否有緩存

當然有啦

Ⅵ android通知欄怎麼添加控制項

Notification的自定義布局是RemoteViews,和其他RemoteViews一樣,在自定義視圖布局文件中,僅支持FrameLayout、LinearLayout、RelativeLayout三種布局控制項和AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper這些顯示控制項,不支持這些類的子類或Android提供的其他控制項。否則會引起ClassNotFoundException異常

步驟如下:

1)創建自定義視圖

2)獲取遠程視圖對象(註:Notification的contentView不能為空)

3)設置PendingIntent(來響應各種事件)

4)發起Notification

大體4步驟這里就不詳細說了,下面就把DEMO中的列子拿出來說下

樣式:

1.自定義帶按鈕通知欄(如下樣式)

正在進行的

「正在進行的」通知使用戶了解正在運行的後台進程。例如,音樂播放器可以顯示正在播放的音樂。也可以用來顯示需要長時間處理的操作,例如下載或編碼視頻。「正在進行的」通知不能被手動刪除。

實現方法如下:

實現方法如下:
/**
*帶按鈕的通知欄
*/
publicvoidshowButtonNotify(){
NotificationCompat.BuildermBuilder=newBuilder(this);
RemoteViewsmRemoteViews=newRemoteViews(getPackageName(),R.layout.view_custom_button);
mRemoteViews.setImageViewResource(R.id.custom_song_icon,R.drawable.sing_icon);
//API3.0以上的時候顯示按鈕,否則消失
mRemoteViews.setTextViewText(R.id.tv_custom_song_singer,"周傑倫");
mRemoteViews.setTextViewText(R.id.tv_custom_song_name,"七里香");
//如果版本號低於(3。0),那麼不顯示按鈕
if(BaseTools.getSystemVersion()<=9){
mRemoteViews.setViewVisibility(R.id.ll_custom_button,View.GONE);
}else{
mRemoteViews.setViewVisibility(R.id.ll_custom_button,View.VISIBLE);
}
//
if(isPlay){
mRemoteViews.setImageViewResource(R.id.btn_custom_play,R.drawable.btn_pause);
}else{
mRemoteViews.setImageViewResource(R.id.btn_custom_play,R.drawable.btn_play);
}
//點擊的事件處理
IntentbuttonIntent=newIntent(ACTION_BUTTON);
/*上一首按鈕*/
buttonIntent.putExtra(INTENT_BUTTONID_TAG,BUTTON_PREV_ID);
//這里加了廣播,所及INTENT的必須用getBroadcast方法
PendingIntentintent_prev=PendingIntent.getBroadcast(this,1,buttonIntent,PendingIntent.FLAG_UPDATE_CURRENT);
mRemoteViews.setOnClickPendingIntent(R.id.btn_custom_prev,intent_prev);
/*播放/暫停按鈕*/
buttonIntent.putExtra(INTENT_BUTTONID_TAG,BUTTON_PALY_ID);
PendingIntentintent_paly=PendingIntent.getBroadcast(this,2,buttonIntent,PendingIntent.FLAG_UPDATE_CURRENT);
mRemoteViews.setOnClickPendingIntent(R.id.btn_custom_play,intent_paly);
/*下一首按鈕*/
buttonIntent.putExtra(INTENT_BUTTONID_TAG,BUTTON_NEXT_ID);
PendingIntentintent_next=PendingIntent.getBroadcast(this,3,buttonIntent,PendingIntent.FLAG_UPDATE_CURRENT);
mRemoteViews.setOnClickPendingIntent(R.id.btn_custom_next,intent_next);

mBuilder.setContent(mRemoteViews)
.setContentIntent(getDefalutIntent(Notification.FLAG_ONGOING_EVENT))
.setWhen(System.currentTimeMillis())//通知產生的時間,會在通知信息里顯示
.setTicker("正在播放")
.setPriority(Notification.PRIORITY_DEFAULT)//設置該通知優先順序
.setOngoing(true)
.setSmallIcon(R.drawable.sing_icon);
Notificationnotify=mBuilder.build();
notify.flags=Notification.FLAG_ONGOING_EVENT;
mNotificationManager.notify(notifyId,notify);
}

如果您對回答滿意,請關注一下俺的微博

Ⅶ iOS 開發中能不能使用類似CSS的方式做到樣式和內容分離

基於MVC的快速開發框架 Bee Framework 是一款iOS快速開發框架,允許開發者使用Objective-C和XML/CSS來進行iPhone和iPad開發,由 Gavin Kwoe 和 QFish 開發並維護。
這套布局庫是以android的線性布局,相對布局,框架布局,表格布局為藍本。同時又具有IOS的AutoLayout的功能,和部分SIZECLASS功能,以及IOS9中的UIStackView的功能,參考了masonry的一些語法機制,但是他卻可以運行在IOS5版本的應用中。使用簡單方便,代碼清晰,而且少。 並且附帶四篇教程文檔:

Ⅷ 誰知怎麼自定義StackView控制項

這就是你遇到的問題的,呵呵

Ⅸ 誰知怎麼自定義StackView控制項

1,配置文件.xml文件中的屬性,目前只知道兩個

<com.youku.widget.YoukuHomePageStackView
android:id="@+id/homepage_stackview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:loopViews="true"
android:layerType="hardware"
/>
android:loopViews:控制是否是輪播效果,能被翻動的,設置為true,就可以被翻動;設置為false,就不能被翻動。。

android:layerType:是設置是否是硬體加速的問題,是為解決布局StackView是在ActionBar下面,自動輪播時候,每一個StackView的Item會翻上來遮擋ActionBar。

還有none,這個是默認屬性,這個屬性就是不進行硬體加速;還有software,這是硬體加速中的軟體加速屬性,據說如果手機不支持hardware,那麼這個

屬性自動會變成software屬性。。。。

2,重寫StackView控制項

package com.youku.widget;

import java.util.Timer;

import java.util.TimerTask;

import com.youku.util.Logger;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.StackView;
import android.support.v4.view.ViewPager;
@SuppressLint("NewApi")
public class YoukuHomePageStackView extends StackView {
public static final String TAG = "LXF";

float dispatchDownXDistance = 0;
float dispatchUpXDistance = 0;
float dispatchDownYDistance = 0;
float dispatchUpYDistance = 0;
private boolean isAutoSlideMode;
private Timer timer;
private TimerTask task;
private static final int MSG_SLIDE = 10000110;
private static final int PERIOD = 5000;

private ViewPager viewPagerFragment;

private Handler handler = new Handler(){

@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case MSG_SLIDE:
showNext();
sendEmptyMessageDelayed(MSG_SLIDE, PERIOD);
break;

default:
break;
}
}

};

public YoukuHomePageStackView(Context context, AttributeSet attrs) {
super(context, attrs);

}

@Override
protected void onWindowVisibilityChanged(int visibility) {
super.onWindowVisibilityChanged(visibility);
Logger.lxf("====onWindowVisibility===visibility===="+visibility);
if(visibility == View.VISIBLE) {
startAutoSlide();
} else {
cancleTask();
}
}
//自動輪播方法,使用handler來實現自動輪播
public void startAutoSlide() {
cancleTask();
handler.sendEmptyMessageDelayed(MSG_SLIDE, PERIOD);
// isAutoSlideMode = true;
// if (timer == null) {
// timer = new Timer();
// task = null;
// task = new TimerTask() {
//
// @Override
// public void run() {
// // F.ot("prove i'm live");
// Message m = Message.obtain();
// m.what = MSG_SLIDE;
// handler.sendMessage(m);
// }
// };
// }
// timer.schele(task, PERIOD, PERIOD);
}

public void cancleTask(){
handler.removeMessages(MSG_SLIDE);
// if(null!=timer){
// timer.cancel();
// timer.purge();
// timer = null;
// }
//
// if(null!=task){
// task.cancel();
// task = null;
// }
}

public void removeAllView(){
removeAllViews();
}

//監聽這個方法主要是為了在ViewPager和StackView之間的事件點擊之間沖突問題。。。

//當StackView被點擊的時候,會觸發dispatchTouchEvent()中的Action_DOWN動作,此時()設置為true,則此時ViewPager不會被觸發,只有StackView才能被觸發。。。
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
int action = ev.getAction();

switch(action){

case MotionEvent.ACTION_DOWN:
viewPagerFragment = (ViewPager)getParent().getParent().getParent().getParent().getParent().getParent().getParent();
dispatchDownXDistance = ev.getX();
dispatchDownYDistance = ev.getY();
cancleTask();
getParent().(true);
// return true;
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
dispatchUpXDistance = ev.getX();
dispatchUpYDistance = ev.getY();
float distanceMoveOne = dispatchUpXDistance-dispatchDownXDistance;
float distanceMoveTwo = dispatchDownXDistance-dispatchUpXDistance;
float distanceMoveY = dispatchUpYDistance-dispatchDownYDistance;
// Logger.lxf("distanceMoveY=="+distanceMoveY);
// Logger.lxf("Math distanceMoveY=="+Math.abs(distanceMoveY));
// Logger.lxf("Math distanceMoveOne=="+Math.abs(distanceMoveOne));
getParent().(false);
startAutoSlide();
if(distanceMoveOne>100&&Math.abs(distanceMoveY)<30){
//向左滑動
viewPagerFragment.setCurrentItem(1);

return false;
}else if(distanceMoveTwo>100&&Math.abs(distanceMoveY)<30){
//向右滑動
viewPagerFragment.setCurrentItem(3);
return false;
}
break;
case MotionEvent.ACTION_CANCEL:
startAutoSlide();
break;
}
return super.dispatchTouchEvent(ev);
}

}

閱讀全文

與androidstackview相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:962
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:144
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:484
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:381
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:349
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163