Android 4.0 でのアプリの作り方
といっても
Compatibility(互換性Sdk)
で作ろう!
Android osの歴史
1.6から2.3まで携帯のみ
3.0 タブレットのみ
4.0
タブレットで培ったUIなど
の技術を携帯でも
使えるとうにと、
APIなんかが統合された
Android 4.0 以下のバージョンで全体の98.4%
なので、
Android 4.0 の SDK で開発すると今のところ動く機種が少ない
なので、
Compatibility(互換性)で開発しまっす
Compatibility って?
android-support-v13.jar を組み込みます
Android 1.6 で、
Android 4.0の見た目、動きができます。
(一部できないけど・・)
Compatibilityがあることで、
Android 4.0でしか使えない機能がほぼ
なくなった。
android-sdk-windows
- extras
- compatibility
- v13
- android-support-v13.jar
のファイルを
外部
jarの追加
でいれます
なんで、そんなめんどくさい
Compatibilityなんてつかうの?
僕の場合、
見た目がいい感じ
Fragmentが使える -> タブレット対応ができる!
めんどくさいことが解消されてるところもある
Android 4.0 今までの画面
大事件発生!
Menuがなくなる!
本田さん情報
あまり
Menuは使われてないとのこと。。。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.helloworld" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="11" /> <application ... > ... </application> </manifest> 必ず android:targetSdkVersion="11" を書くこと! 書くと、システムは holographic テーマを各アクティビティに適用し、 各アクティビティにはアクションバーが加わる
どうやったらいいの?
どうやったらいいの?
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO 自動生成されたメソッド・スタブ
super.onCreateOptionsMenu(menu); {
MenuItem mi = menu.add( "menu1" );
mi.setIcon( android.R.drawable.ic_delete ); }
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// TODO 自動生成されたメソッド・スタブ
super.onCreateOptionsMenu(menu); {
MenuItem mi = menu.add( "menu1" );
mi.setIcon( android.R.drawable.ic_delete ); MenuCompat.setShowAsAction(mi, 1 );
2.2で実行したらこんなの
Android4.0じゃないと
ActionBarは
Android 4.0で動かさないと
でないので、
採用見送って、
自分で作りました。
右上にボタンあれば
それっぽい
じゃん!
大事件発生!
Menuボタンがなくなって・・・
Recent Tasks とは?
2.3以下では
ホームボタン長押しで
表示されていた機能
今まで起動したアプリで、
ホームボタンで終わらせた
アプリのみを列挙して
アプリ → 別アプリへと
移れる機能
普通は、
アプリ → ホーム画面 →
別アプリのアイコンクリック
→ 別アプリの順
Android 4.0 の
RecentTasks
長押しでは
なくなった!
MENUボタンがなくなって
Android 4.0のRecent Tasksは強力!
今まではホームボタンで終わらせたアプリ6個だけ列挙
しかし!
一度立ち上げたアプリならばすべて列挙!
アプリ → 別アプリ の遷移がめっちゃ楽!
僕の一押し機能!
Recent Tasksの注意点
Static変数使うとやばし
staticは禁止です。
Activity B
Activity A
Static String Text = “A” Text = “A”
タスクキラーでアプリを殺す
Activity A から始まる
いままでの動き
Activity B
Activity A
Static String Text = “A” Text = “A”
タスクキラーでアプリを殺す
Activity B から始まる!
Textは null になっててNullPointer でエラー
Android 4.0
Static は使わずにちゃんとIntentで値
を渡そう!
じゃないと
Android 4.0ではRecent Tasksボタン
をユーザーが使いまくるので、
NullPointerで
もし、
Activity にそのままコードを書いちゃうと、
タブレット対応したい場合、
Fragmentに書き直し
になっちゃいます。
非同期でダイアログだして処理するようなことがあって、
画面の横と縦を切り替えるとエラーがでたりするのを
回避できる
などなど
Activity
リストの
Fragment
データの詳細
Fragment
Fragmentの書き方
public class FragmentTest extends Fragment {@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 最初の1回だけ呼ばれる
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// ActivityのViewとかの準備ができるたびに呼ばれる
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
super.onCreateView(inflater, container, savedInstanceState);
// Fragmentで表示するViewを設定するだけ
View v = inflater.inflate( R.layout.activity_list, null);
return v; }
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); }
@Override
public void onPause() {
super.onPause(); }
@Override
public void onResume() {
super.onResume(); }
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <fragment android:name="com.example.news.ArticleListFragment" android:id="@+id/list" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> <fragment android:name="com.example.news.ArticleReaderFragment" android:id="@+id/viewer" android:layout_weight="2" android:layout_width="0dp" android:layout_height="match_parent" /> </LinearLayout>
Fragmentをレイアウトで貼りつける
利点はなにがあるの?
すきな場所に貼れる(
Tablet UIのため)
横向きになったときに、
Activityは破棄されるけど
Fragmentは破棄されない。
→ 変数もそのまま維持
→ オブジェクトもそのまま維持
→ スレッド処理してもエラーでない
Activityでも回避方法あったけど、
コード書くのがめんどくさい
!
String mText;
int mNumber;
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//変数を一時保存するとき
outState.putString( "mText", mText ); outState.putInt( "mNumber" , mNumber ); }
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
// 変数を復帰させるとき
mText = savedInstanceState.getString( "mText" );
mNumber = savedInstanceState.getInt( "mNumber" ); }
public class Test extends Activity { String mText;
int mNumber;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Object[] obj = (Object[])getLastNonConfigurationInstance();
if ( obj != null ) { mText = (String)obj[0]; mNumber = (Integer)obj[1]; } } @Override
public Object onRetainNonConfigurationInstance() {
super.onRetainNonConfigurationInstance();
// オブジェクトを1つだけ保存できる
Object[] obj = new Object[2]; obj[0] = mText;
obj[1] = mNumber;
return obj; }