2011年2月23日水曜日

Android 3.0 Platform - 1 -

長いので分割します。
ここには、以下が含まれます。

 ・Fragments
 ・Action Bar
 ・System clipboard
 ・Drag and drop

Android 3.0 Platform - 1 -
Android 3.0 Platform - 2 -
Android 3.0 Platform - 3 -

---------------------------

Android 3.0 Platform

API Level: 11

Android 3.0 platform が Android SDK としてダウンロードできるようになりました。ダウンロードできる platform には Andorid のライブラリとシステムイメージ、エミュレータのスキンなどが含まれますが、外部ライブラリは含まれません。

Android 3.0 の開発とテストを開始するには Android SDK Manager を使って platform をあなたの SDK にダウンロードしてください。より詳しい情報は Adding SDK Components を見てください。もし Android 開発が初めてなら、 download the SDK Starter Package から初めてください。

Android 3.0 のよりハイレベルの紹介は Platform Highlights を見てください。

Note: すでに Android アプリケーションを公開している場合、できる限り早く、あなたのアプリケーションを Android 3.0 でテストし最適化してください。あなたのアプリケーションが最新の Android-powered デバイスでベストな体験ができることをユーザーに確約すべきです。そのために何ができるかのより詳しい情報は Optimizing Apps for Android 3.0 を見てください。

---------------------------

API Overview

以下のセクションは Android 3.0 で新しく追加された機能・以前のAPIから変更された内容のテクニカルオーバービューです。

---------------------------

Fragments

Fragment は新しいフレームワークコンポーネントです。これにより、自身の UI とライフサイクルを定義した self-contained なモジュールに Activityの異なるのエレメントを分離することができます。Fragment を作成するには、Fragment クラスを継承し、Activity に似たいくつかのライフサイクルコールバックメソッドを実装しなければなりません。複数の Fragment を合わせることで、1つの Activity 内で multi-pane UI を作成することができ、各 pane が自身のライフサイクルとユーザーの入力を管理します。

さらに、UIを提供しないで Fragment を使い、Activity が走っている間だけ発生する download の進捗管理など、Activity 用の worker として使用することができます。

加えて:

 ・Fragment は self-contained で複数の Activity で再利用できる。

 ・Activity 内で、Fragment の追加、削除、置換、アニメーションが可能。

 ・Activity によって管理される back stack に Fragment を追加でき、変更時に Fragment の状態を保存するので、ユーザーは様々な状態を介して前後に移動できる。

 ・代替レイアウトを提供する(providing alternative layouts) ことで、画面サイズおよび向きに応じて Fragment を混ぜたり合わせたりできる

 ・Fragment はそれらの含む Activity への直接アクセスを持っているので、Activity の Action Bar (次で述べる) のアイテムに寄与できる。

Activity 内で Fragment を管理するには FragmentManager を使う必要があります。これは、Fragment とインタラクトするいくつかの API を提供します。例えば、Activity 内の Fragment を見つけたり、以前の状態をリストアするために back stack へ Fragment を pop したりできます。

Fragment の追加や削除などの transaction を行うには、FragmentTransaction を生成する必要があります。その後、add(), remove(), replace() などのメソッドを呼ぶことで transaction を実行できます。transaction に対して行いたい全ての変更を適用するには、commit() メソッドを呼ばなければなりません。そうするとシステムが Fragment の transaction を Activity に適用します。

Fragment を使用するためのより詳しい情報は、Fragments ドキュメントを読んでください。いくつかのサンプルは API Demos アプリケーションにあります。

---------------------------

Action Bar

Action Bar は Activity Window の上部にあったこれまでのタイトルバーを置き換えるものです。これはアプリケーションのロゴを左隅に含み、Option Menu 内のアイテムへの新しいインタフェースを提供します。加えて、Action Bar は次のことが可能です。

 ・"action items" として Action Bar に直接メニューアイテムを追加することができる

  メニューアイテムの XML 定義で、android:showAsAction 属性に "ifRoom" を設定します。十分な room がある場合、メニューアイテムは Action Bar に直接表示されます。そうではない場合、Action Bar の右側にあるメニューアイコンで表示される overflow メニュー内に配置されます。

 ・"action view" を作成することで、検索ボックスのようなウィジェットに action item を置き換えられる

  メニューアイテムの XML 定義で、android:actionViewLayout 属性にレイアウトリソースを指定し、android:actionViewClass 属性にウィジェットのクラス名を指定します(Action Bar にアイテムが現れるように android:showAsAction 属性も定義しなければなりません)。Action Bar に十分な room がなくアイテムが overflow メニューに表示される場合、それはこれまでのメニューアイテムのように振る舞い、ウィジェットは表示されません。

 ・アプリケーションロゴにアクションを追加し、カスタムロゴに置き換える

  アプリケーションロゴは自動的に android.R.id.home ID が割り当てられ、タッチされたときシステムから Activity の onOptionItemSelected() コールバックに渡されます。コールバックメソッド内でこの ID に単純に応答することで、アプリケーションの "home" Activity へ移動するなどのアクションを実装できます。

  ロゴをアイコンに置き換えるには、マニフェストファイル内で android:logo 属性にロゴを指定します。そうすると、Activity で setDisplayUseLogoEnabled(true) が呼ばれます。

 ・Fragment の back stack へのナビゲーションとしてパンくずリストを追加する

 ・Fragment へのナビゲーションとしてタブもしくは drop-down list を追加する

 ・テーマと背景で Action Bar をカスタマイズする

Action Bar は新しい holographic theme を使う全てのアプリケーションにとって標準です。つまり android:minSdkVersion もしくは android:targetSdkVersion"11" に設定されている場合にとって標準になります。

Action Bar のより詳しい情報は、Action Bar ドキュメントを読んでください。いくつかのサンプルは API Demos アプリケーションにあります。

---------------------------

System clipboard

アプリケーションは system-wide クリップボードへデータ(単なるテキストを超えて)コピー&ペーストできるようになりました。クリップボードデータはプレーンテキストやURI、Intent も可能です。

content provider を通して、ユーザーにコピーさせたいデータへのシステムアクセスを提供することで、ユーザーは複雑なコンテント(画像やデータ構造など)をあなたのアプリケーションからコピーし、そのコンテントタイプをサポートする別のアプリケーションにペーストすることができます。

クリップボードを使うには、まず getSystemService(CLIPBOARD_SERVICE) を呼んで、グローバルの ClipboardManager オブジェクトを取得します。

クリップボードにアイテムをコピーするには、新しい ClipData オブジェクトを生成し、単一のエンティティが記述された 1つ以上の ClipData.Item をそれに保持させる必要があります。1つの ClipData.Item を含むだけの ClipData オブジェクト を作成する場合、newPlainText(), newUri(), newIntent() などのヘルパーメソッドを使うことができます。これらはあなたが提供した ClipData.Item を pre-loaded して ClipData オブジェクトを返します。

ClipData をクリップボードに追加するには、ClipboardManager のインスタンスの setPrimaryClip() メソッドで ClipData を渡します。

そうすると、ClipboardManager の getPriimaryClip() を呼ぶことでクリップボードからファイルを読むことができます。あなたが受け取る ClipData のハンドリングは複雑になる可能性があります。そのため、実際に張り付ける前にクリップボード内のデータタイプがハンドルできるかどうか確認する必要があります。

クリップボードはクリップするデータの一欠片(つまり ClipData オブジェクト) しか保持することができません。しかし、一つの ClipData は複数の ClipData.Item を含むことができます。

より詳しい情報は Copy and Paste ドキュメントを読んでください。また、コピー&ペーストの簡単な実装は API Demos に、より複雑な実装は Note Pad アプリケーションで見ることができます。

---------------------------

Drag and drop

新しい API はあなたのアプリケーションのユーザーインタフェースでのドラッグ&ドロップ操作を単純化します。ドラッグ操作はある場所から別の場所へいくつか種類のデータ転送(ClipData オブジェクト内で運ばれる)です。ドラッグ操作の開始と終了地点は View です。そのため、ドラッグ&ドロップ操作を直接ハンドルする API は View クラス内にあります。

ドラッグ&ドロップ操作は ACTION_DRAG_STARTED, ACTION_DRAG_ENTERED, ACTION_DROP などの、いくつかのドラッグアクション(DragEvent オブジェクトで定義される)で定義されたライフサイクルを持ちます。ドラッグ操作に携わりたい各 View はこれらのアクションを listen することができます。

あなたの Activity でコンテンツのドラッグを開始するには、View の startDrag() を呼びます。これはドラッグするデータを表す ClipData オブジェクト提供します。View.DragShadowBuilder によって、ユーザーがドラッグしている間指の下に見える "shadow" を簡単に作ることができます。startDrag() で提供される Object はドラッグするオブジェクトの情報を、受け取る view との間で共有することができます。

View で ドラッグされたオブジェクトを許可する ("drop" を受け取る) には、setOnDragListener() を呼んで view に OnDragListener をレジストします。view 上でドラッグイベントが起こると、システムは OnDragListener に対して onDrag() を呼びます。これは、発生したドラッグアクションのタイプ (ACTION_DRAG_STARTED, ACTION_DRAG_ENTERED, ACTION_DROP など)が記述された DragEvent を受け取ります。ドラッグイベントのストリームを配信するために、ドラッグの間システムは繰り返しドラッグ下にある view に対して onDrag() を呼びます。受け取る view は onDragEvent() に運ばれるイベントタイプを DragEvent の getAction() を呼ぶことで問い合わせることができます。


Note: ドラッグイベントは ClipData オブジェクトを運びますが、これはシステムのクリップボードとは関係ありません。ドラッグ&ドロップ操作はドラッグしているデータをシステムのクリップボードに入れることはありません。

より詳しい情報は、Dragging and Dropping ドキュメントを読んでください。ドラッグ&ドロップの実装は API Demos アプリケーションと Honeycomb Gallery アプリケーションで見ることができます。


 

0 件のコメント:

コメントを投稿

'},ClipboardSwf:null,Version:'1.5.1'}};dp.SyntaxHighlighter=dp.sh;dp.sh.Toolbar.Commands={ExpandSource:{label:'+ expand source',check:function(highlighter){return highlighter.collapse;},func:function(sender,highlighter) {sender.parentNode.removeChild(sender);highlighter.div.className=highlighter.div.className.replace('collapsed','');}},ViewSource:{label:'view plain',func:function(sender,highlighter) {var code=dp.sh.Utils.FixForBlogger(highlighter.originalCode).replace(/'+code+'');wnd.document.close();}},CopyToClipboard:{label:'copy to clipboard',check:function(){return window.clipboardData!=null||dp.sh.ClipboardSwf!=null;},func:function(sender,highlighter) {var code=dp.sh.Utils.FixForBlogger(highlighter.originalCode).replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&');if(window.clipboardData) {window.clipboardData.setData('text',code);} else if(dp.sh.ClipboardSwf!=null) {var flashcopier=highlighter.flashCopier;if(flashcopier==null) {flashcopier=document.createElement('div');highlighter.flashCopier=flashcopier;highlighter.div.appendChild(flashcopier);} flashcopier.innerHTML='';} alert('The code is in your clipboard now');}},PrintSource:{label:'print',func:function(sender,highlighter) {var iframe=document.createElement('IFRAME');var doc=null;iframe.style.cssText='position:absolute;width:0px;height:0px;left:-500px;top:-500px;';document.body.appendChild(iframe);doc=iframe.contentWindow.document;dp.sh.Utils.CopyStyles(doc,window.document);doc.write('

'+highlighter.div.innerHTML+'

');doc.close();iframe.contentWindow.focus();iframe.contentWindow.print();alert('Printing...');document.body.removeChild(iframe);}},About:{label:'?',func:function(highlighter) {var wnd=window.open('','_blank','dialog,width=300,height=150,scrollbars=0');var doc=wnd.document;dp.sh.Utils.CopyStyles(doc,window.document);doc.write(dp.sh.Strings.AboutDialog.replace('{V}',dp.sh.Version));doc.close();wnd.focus();}}};dp.sh.Toolbar.Create=function(highlighter) {var div=document.createElement('DIV');div.className='tools';for(var name in dp.sh.Toolbar.Commands) {var cmd=dp.sh.Toolbar.Commands[name];if(cmd.check!=null&&!cmd.check(highlighter)) continue;div.innerHTML+=''+cmd.label+'';} return div;} dp.sh.Toolbar.Command=function(name,sender) {var n=sender;while(n!=null&&n.className.indexOf('dp-highlighter')==-1) n=n.parentNode;if(n!=null) dp.sh.Toolbar.Commands[name].func(sender,n.highlighter);} dp.sh.Utils.CopyStyles=function(destDoc,sourceDoc) {var links=sourceDoc.getElementsByTagName('link');for(var i=0;i');} dp.sh.Utils.FixForBlogger=function(str) {return(dp.sh.isBloggerMode==true)?str.replace(/
|<br\s*\/?>/gi,''):str;} dp.sh.RegexLib={MultiLineCComments:new RegExp('/\\*[\\s\\S]*?\\*/','gm'),SingleLineCComments:new RegExp('//.*$','gm'),SingleLinePerlComments:new RegExp('#.*$','gm'),DoubleQuotedString:new RegExp('"(?:\\.|(\\\\\\")|[^\\""\\n])*"','g'),SingleQuotedString:new RegExp("'(?:\\.|(\\\\\\')|[^\\''\\n])*'",'g')};dp.sh.Match=function(value,index,css) {this.value=value;this.index=index;this.length=value.length;this.css=css;} dp.sh.Highlighter=function() {this.noGutter=false;this.addControls=true;this.collapse=false;this.tabsToSpaces=true;this.wrapColumn=80;this.showColumns=true;} dp.sh.Highlighter.SortCallback=function(m1,m2) {if(m1.indexm2.index) return 1;else {if(m1.lengthm2.length) return 1;} return 0;} dp.sh.Highlighter.prototype.CreateElement=function(name) {var result=document.createElement(name);result.highlighter=this;return result;} dp.sh.Highlighter.prototype.GetMatches=function(regex,css) {var index=0;var match=null;while((match=regex.exec(this.code))!=null) this.matches[this.matches.length]=new dp.sh.Match(match[0],match.index,css);} dp.sh.Highlighter.prototype.AddBit=function(str,css) {if(str==null||str.length==0) return;var span=this.CreateElement('SPAN');str=str.replace(/ /g,' ');str=str.replace(/');if(css!=null) {if((/br/gi).test(str)) {var lines=str.split(' 
');for(var i=0;ic.index)&&(match.index/gi,'\n');var lines=html.split('\n');if(this.addControls==true) this.bar.appendChild(dp.sh.Toolbar.Create(this));if(this.showColumns) {var div=this.CreateElement('div');var columns=this.CreateElement('div');var showEvery=10;var i=1;while(i<=150) {if(i%showEvery==0) {div.innerHTML+=i;i+=(i+'').length;} else {div.innerHTML+='·';i++;}} columns.className='columns';columns.appendChild(div);this.bar.appendChild(columns);} for(var i=0,lineIndex=this.firstLine;i0;i++) {if(Trim(lines[i]).length==0) continue;var matches=regex.exec(lines[i]);if(matches!=null&&matches.length>0) min=Math.min(matches[0].length,min);} if(min>0) for(var i=0;i

Blogger Syntax Highliter

Version: {V}

http://www.dreamprojections.com/syntaxhighlighter

©2004-2007 Alex Gorbatchev.

'},ClipboardSwf:null,Version:'1.5.1'}};dp.SyntaxHighlighter=dp.sh;dp.sh.Toolbar.Commands={ExpandSource:{label:'+ expand source',check:function(highlighter){return highlighter.collapse;},func:function(sender,highlighter) {sender.parentNode.removeChild(sender);highlighter.div.className=highlighter.div.className.replace('collapsed','');}},ViewSource:{label:'view plain',func:function(sender,highlighter) {var code=dp.sh.Utils.FixForBlogger(highlighter.originalCode).replace(/'+code+'');wnd.document.close();}},CopyToClipboard:{label:'copy to clipboard',check:function(){return window.clipboardData!=null||dp.sh.ClipboardSwf!=null;},func:function(sender,highlighter) {var code=dp.sh.Utils.FixForBlogger(highlighter.originalCode).replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&');if(window.clipboardData) {window.clipboardData.setData('text',code);} else if(dp.sh.ClipboardSwf!=null) {var flashcopier=highlighter.flashCopier;if(flashcopier==null) {flashcopier=document.createElement('div');highlighter.flashCopier=flashcopier;highlighter.div.appendChild(flashcopier);} flashcopier.innerHTML='';} alert('The code is in your clipboard now');}},PrintSource:{label:'print',func:function(sender,highlighter) {var iframe=document.createElement('IFRAME');var doc=null;iframe.style.cssText='position:absolute;width:0px;height:0px;left:-500px;top:-500px;';document.body.appendChild(iframe);doc=iframe.contentWindow.document;dp.sh.Utils.CopyStyles(doc,window.document);doc.write('

'+highlighter.div.innerHTML+'

');doc.close();iframe.contentWindow.focus();iframe.contentWindow.print();alert('Printing...');document.body.removeChild(iframe);}},About:{label:'?',func:function(highlighter) {var wnd=window.open('','_blank','dialog,width=300,height=150,scrollbars=0');var doc=wnd.document;dp.sh.Utils.CopyStyles(doc,window.document);doc.write(dp.sh.Strings.AboutDialog.replace('{V}',dp.sh.Version));doc.close();wnd.focus();}}};dp.sh.Toolbar.Create=function(highlighter) {var div=document.createElement('DIV');div.className='tools';for(var name in dp.sh.Toolbar.Commands) {var cmd=dp.sh.Toolbar.Commands[name];if(cmd.check!=null&&!cmd.check(highlighter)) continue;div.innerHTML+=''+cmd.label+'';} return div;} dp.sh.Toolbar.Command=function(name,sender) {var n=sender;while(n!=null&&n.className.indexOf('dp-highlighter')==-1) n=n.parentNode;if(n!=null) dp.sh.Toolbar.Commands[name].func(sender,n.highlighter);} dp.sh.Utils.CopyStyles=function(destDoc,sourceDoc) {var links=sourceDoc.getElementsByTagName('link');for(var i=0;i');} dp.sh.Utils.FixForBlogger=function(str) {return(dp.sh.isBloggerMode==true)?str.replace(/
|<br\s*\/?>/gi,'\n'):str;} dp.sh.RegexLib={MultiLineCComments:new RegExp('/\\*[\\s\\S]*?\\*/','gm'),SingleLineCComments:new RegExp('//.*$','gm'),SingleLinePerlComments:new RegExp('#.*$','gm'),DoubleQuotedString:new RegExp('"(?:\\.|(\\\\\\")|[^\\""\\n])*"','g'),SingleQuotedString:new RegExp("'(?:\\.|(\\\\\\')|[^\\''\\n])*'",'g')};dp.sh.Match=function(value,index,css) {this.value=value;this.index=index;this.length=value.length;this.css=css;} dp.sh.Highlighter=function() {this.noGutter=false;this.addControls=true;this.collapse=false;this.tabsToSpaces=true;this.wrapColumn=80;this.showColumns=true;} dp.sh.Highlighter.SortCallback=function(m1,m2) {if(m1.indexm2.index) return 1;else {if(m1.lengthm2.length) return 1;} return 0;} dp.sh.Highlighter.prototype.CreateElement=function(name) {var result=document.createElement(name);result.highlighter=this;return result;} dp.sh.Highlighter.prototype.GetMatches=function(regex,css) {var index=0;var match=null;while((match=regex.exec(this.code))!=null) this.matches[this.matches.length]=new dp.sh.Match(match[0],match.index,css);} dp.sh.Highlighter.prototype.AddBit=function(str,css) {if(str==null||str.length==0) return;var span=this.CreateElement('SPAN');str=str.replace(/ /g,' ');str=str.replace(/');if(css!=null) {if((/br/gi).test(str)) {var lines=str.split(' 
');for(var i=0;ic.index)&&(match.index/gi,'\n');var lines=html.split('\n');if(this.addControls==true) this.bar.appendChild(dp.sh.Toolbar.Create(this));if(this.showColumns) {var div=this.CreateElement('div');var columns=this.CreateElement('div');var showEvery=10;var i=1;while(i<=150) {if(i%showEvery==0) {div.innerHTML+=i;i+=(i+'').length;} else {div.innerHTML+='·';i++;}} columns.className='columns';columns.appendChild(div);this.bar.appendChild(columns);} for(var i=0,lineIndex=this.firstLine;i0;i++) {if(Trim(lines[i]).length==0) continue;var matches=regex.exec(lines[i]);if(matches!=null&&matches.length>0) min=Math.min(matches[0].length,min);} if(min>0) for(var i=0;i

ページビューの合計