2014年2月5日

貯めマスっち アップデート

貯めマスっち アップデート

貯金ができるようにとゆるキャラで挑んだアプリ"貯めマスっち"

アプリ利用者の方から要望がありました。

貯めマスっち
貯めマスっちという貯金キャラが応援してくれて
日々マスをタッチしていってマスを埋めていく感覚で
貯金をしていくというシンプルなものです。
《ご要望》
・目標タスク別に設定できるようにしてほしい。


アプリを公開して4ヶ月順調にDL数は伸びるものの、若干停滞気味。

このままでいいのかというのを考えていた矢先でした。

要望を頂き、対応することにしました。

シンプルな要望に対して、プログラム上は解決しなければいけない問題が多くありました。

  1. データ保存方法
  2. データ取得方法
  3. 画面構成
  4. 利用中のデータ引継ぎ方法

1.データ保存方法について

問題:SharedPreferencesデータ保存の為、複雑なデータは向かない。
解決方法:SQLiteを採用

現状では保存すべきデータは3つだった為、SharedPreferencesで十分でした。
要望の項目を増やすということはデータ保存数がユーザーによって変わる為、
SQLiteを採用しました。このことは次の取得方法にも関わります。


2.データ取得方法

問題:SharedPreferencesではタスクごとに関連するデータを引き出せない。
解決方法:SQLiteを採用

やはりデータ取得もデータベースを使用します。

複数の項目に対して、それに対応する値を引き出すにはデータベースは必須でしょう。

3.画面構成

現状:目標タスクを選択するような画面が無い
解決方法:ActionBarのリストナビゲーションを使用

大幅な画面構成の変更は勇気がいることでした。
がらっと印象が変わりアプリらしくなったといえばなったような?
アップデート前
アップデート後

4.利用中のデータ引継ぎ

問題:データ保存、取得方法が変わる為、旧データが使えない。
解決方法:旧データを取得し、SQliteデータベースに初回だけ記録させる

旧データがSharedPreferences、新データがSQLite
共存させる訳にもいかず、旧データにフラグを所持させて
フラグが立ってない(既存ユーザー)のデータだけデータベースに記録させることで回避。


マンネリ化していたアプリ作りにユーザーからの要望という良い刺激、励みになりました。

ありがとうございました。



2014年1月14日

AdapterContextMenuInfoとは

AdapterContextMenuInfo

ContextMenuの選択されたアイテム情報(idやposition)を取得するときに使用します。

ContextMenuInfoの項がそのままですが再度掲載します。

getIdとかgetPositionとしがちですが、AdapterContextMenuInfo.positionまたはidでいいです。

以下ソース例ではpositionを取得します。


ListView表示
ContextMenu表示
ContextMenu選択
















MainActivity.java
public class MainActivity extends Activity{
 static final int CONTEXT_MENU1_ID = 0;//ContextMenuアイテムid
 static final int CONTEXT_MENU2_ID = 1;//ContextMenuアイテムid
 private AdapterContextMenuInfo adapterInfo;
 private ListView _contextlistView;
 private String _listitem;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 
  ListView _listview = (ListView) findViewById(R.id.listView1);
 
  String[] _stTest = { "テスト1", "テスト2", "テスト3"};//ListVieの表示アイテム
 
        ArrayAdapter<string> adapter = new ArrayAdapter<string>(this,
                android.R.layout.simple_list_item_1, _stTest);

        _listview.setAdapter(adapter);//アダプターセット
     
        registerForContextMenu(_listview);//ContextMenu登録
     
 }

 public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
     super.onCreateContextMenu(menu, view, info);
     adapterInfo = (AdapterContextMenuInfo) info;
    
     _contextlistView = (ListView) view;
     _listitem = (String) _contextlistView.getItemAtPosition(adapterInfo.position);//list選択アイテム名を取得
    
     menu.setHeaderTitle("menu");//メニュータイトル
     //Menu.add(int groupId, int itemId, int order, CharSequence title)
     menu.add(0,CONTEXT_MENU1_ID,0,"トースト表示(アイテム名)");
     menu.add(0,CONTEXT_MENU2_ID,0,"トースト表示(アイテムid)");
 }
    
     @Override
     public boolean onContextItemSelected(MenuItem item) {//ContextMenuアイテム選択イベント
     switch (item.getItemId()) {
     case CONTEXT_MENU1_ID:
      //選択されたアイテム名表示
      Toast.makeText(this, _listitem, Toast.LENGTH_SHORT).show();
    
     return true;
     case CONTEXT_MENU2_ID:
      //選択されたアイテムid表示
      Toast.makeText(this, String.valueOf(adapterInfo.id), Toast.LENGTH_SHORT).show();
    
     return true;
     default:
     return super.onContextItemSelected(item);
     }
    }
}




res/layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android1="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <TextView
        android1:id="@+id/textView1"
        android1:layout_width="wrap_content"
        android1:layout_height="wrap_content"
        android1:text="ListView"
        android1:textAppearance="?android:attr/textAppearanceLarge" />

    <ListView
        android1:id="@+id/listView1"
        android1:layout_width="match_parent"
        android1:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

2014年1月7日

ViewGroupとは

ViewGroup

ボタンやテキストのことをViewといい

LinearLayoutやFrameLayout等のレイアウト系のことをViewGroupといいます。

言葉の定義よりもこれで何ができるかですが

  • ActionBar.TabのFramLayoutにレイアウトをセットする際に使用する。※
  • Layoutparams(fill_parentやwrap_content)を動的に変更できる
※今回紹介します。

Fragment 画面1を選択
Fragment 画面2を選択

MainActivity.java
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.container);//
ActionBar ab = getSupportActionBar();
// アイコンを表示しない
ab.setDisplayShowHomeEnabled(false);
// SHOW_TITLEのフラグを消すことで、タイトル表示を消す
ab.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);

ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);//tabを利用するときの決まり文句
ab.addTab(ab
.newTab()//新規作成
.setText("画面1")//tab文字
.setTabListener(
new MainTabListener<fragment1>(this, "f1",Fragment1.class)));//読み込むclassを指定
ab.addTab(ab
.newTab()
.setText("画面2")
.setTabListener(
new MainTabListener<fragment2>(this, "f2",Fragment2.class)));
ab.addTab(ab
.newTab()
.setText("画面3")
.setTabListener(
new MainTabListener<fragment3>(this, "f3",Fragment3.class)));

ab.getTabAt(1).select(); // 左:0 中:1 右:2 今回は初期tab選択位置を真ん中に指定

}
public class MainTabListener<t extends="" fragment=""> implements TabListener {

private Fragment fragment;
private final Activity activity;
private final String tag;
private final Class<t> cls;

public MainTabListener(Activity activity, String tag, Class<t> cls) {
this.activity = activity;
this.tag = tag;
this.cls = cls;
}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if (fragment == null) {
fragment = Fragment.instantiate(activity, cls.getName());
ft.replace(R.id.container, fragment, tag);

} else {
fragment = Fragment.instantiate(activity, cls.getName());
ft.replace(R.id.container, fragment, tag);
}
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if (fragment != null) {
ft.detach(fragment);
   }
  }
 }
}

Fragment1.java (Fragment2、3はほぼ同じ内容なので省きます)
public class Fragment1  extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.frag1, container, false);//レイアウトxmlファイルを指定
}

@Override
public void onStart() {
super.onStart();
//ここに処理内容を記載

}
}
res/layout/container.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

</FrameLayout>
res/layout/frag1.xml (Fragment2、3はほぼ同じ内容なので省きます)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="画面1"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>
res/values/styles.xml
<resources>

    <style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light">//@style/Theme.AppCompatか@style/Theme.AppCompat.Light選択必須

    </style>

    <style name="AppTheme" parent="AppBaseTheme">

    </style>

</resources>


2014年1月5日

Viewとは

View

細かいことは色々あって難しいですが、要は、TextViewやButtonのウィジェットの元となるクラスで

描画やクリックイベント(OnClickListener)処理するときに使用します。

以下ソース例ではview.getId()でクリックイベントをセットしたButtonのIdを取得しています。

Button配置
Clickイベント
















MainAcitivity.java
public class MainActivity extends Activity implements OnClickListener{

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//ボタン部品取得
Button _btn1 = (Button)findViewById(R.id.button1);
Button _btn2 = (Button)findViewById(R.id.button2);
Button _btn3 = (Button)findViewById(R.id.button3);

//ボタンをクリックリスナーへ登録
_btn1.setOnClickListener(this);
_btn2.setOnClickListener(this);
_btn3.setOnClickListener(this);
}

@Override
public void onClick(View arg0) {
// TODO 自動生成されたメソッド・スタブ
//オススメはswitchを使用
switch(arg0.getId()){

case R.id.button1:
//【おはようボタン】のイベントを記載
Toast.makeText(this, "おはよう!", Toast.LENGTH_SHORT).show();   
break;

case R.id.button2:
//【こんにちわボタン】のイベントを記載
Toast.makeText(this, "こんにちわ!", Toast.LENGTH_SHORT).show();
break;

case R.id.button3:
//【こんばんわボタン】のイベントを記載
Toast.makeText(this, "こんばんわ!", Toast.LENGTH_SHORT).show();   
break;
}

}
}




res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    >
    <Button
        android:text="おはよう"
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </Button>
    <Button
        android:text="こんにちわ"
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </Button>
    <Button
        android:text="こんばんわ"
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </Button>
</LinearLayout>

2014年1月4日

OnClickListenerとは

OnClickListener

ボタン等、部品にクリックイベントを設定する為に使用します。

設定する方法はいくつかありますが、implementsに設定する方法をオススメします。

かつswitchでボタンidを判定する方法が自分は好きです。

Button配置
Clickイベント
















MainAcitivity.java
public class MainActivity extends Activity implements OnClickListener{

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

//ボタン部品取得
Button _btn1 = (Button)findViewById(R.id.button1);
Button _btn2 = (Button)findViewById(R.id.button2);
Button _btn3 = (Button)findViewById(R.id.button3);

//ボタンをクリックリスナーへ登録
_btn1.setOnClickListener(this);
_btn2.setOnClickListener(this);
_btn3.setOnClickListener(this);
}

@Override
public void onClick(View arg0) {
// TODO 自動生成されたメソッド・スタブ
//オススメはswitchを使用
switch(arg0.getId()){

case R.id.button1:
//【おはようボタン】のイベントを記載
Toast.makeText(this, "おはよう!", Toast.LENGTH_SHORT).show();   
break;

case R.id.button2:
//【こんにちわボタン】のイベントを記載
Toast.makeText(this, "こんにちわ!", Toast.LENGTH_SHORT).show();
break;

case R.id.button3:
//【こんばんわボタン】のイベントを記載
Toast.makeText(this, "こんばんわ!", Toast.LENGTH_SHORT).show();   
break;
}

}
}




res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:gravity="center"
    >
    <Button
        android:text="おはよう"
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </Button>
    <Button
        android:text="こんにちわ"
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </Button>
    <Button
        android:text="こんばんわ"
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    </Button>
</LinearLayout>

MenuItemとは

MenuItem

オプションメニューやアクションバーのメニューや、色んなメニューのアイテムを

格納するときに使用します。もちろん使用しなくてもいいですがソースをスッキリできます。

なおActionBarを下位APIで使用可能とする為、support.v7を使用している為、

menu表示に※注意があります。

※MenuItemCompat.setShowAsAction(_item1, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);

ActionBar Menu
OnMenuItemClickListener

















MainActivity.java
public class MainActivity extends ActionBarActivity{
private ActionBar ab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

ab = getSupportActionBar();
ab.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);//初期画面をStandardで設定

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
//ヘルプメニュー作成
MenuItem _item1 = menu.add(0 , 0 ,0,"Help").setIcon(android.R.drawable.ic_menu_help);
MenuItemCompat.setShowAsAction(_item1, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
_item1.setOnMenuItemClickListener(new OnMenuItemClickListener(){//ヘルプボタンイベントリスナー
@Override
public boolean onMenuItemClick(MenuItem item) {
// TODO 自動生成されたメソッド・スタブ
Toast.makeText(MainActivity.this, "ヘルプ!", Toast.LENGTH_SHORT).show();   
return false;
}
});

//設定メニュー作成
MenuItem _item2 = menu.add(0 , 1 ,0,"Setting").setIcon(android.R.drawable.ic_menu_preferences);
MenuItemCompat.setShowAsAction(_item2, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
_item2.setOnMenuItemClickListener(new OnMenuItemClickListener(){//設定ボタンイベントリスナー
@Override
public boolean onMenuItemClick(MenuItem item) {
// TODO 自動生成されたメソッド・スタブ
Toast.makeText(MainActivity.this, "設定!", Toast.LENGTH_SHORT).show();   
return false;
}
});

return true;
}
}


2014年1月3日

OnMenuItemClickListenerとは

OnMenuItemClickListener

メニューをクリックしたときのイベントリスナーを設定するもの。

以下ソース例ではActionBar内のメニュー要素をクリックでToastを発行しています。

なおActionBarを下位APIで使用可能とする為、support.v7を使用している為、

menu表示に※注意があります。

※MenuItemCompat.setShowAsAction(_item1, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);

ActionBar Menu
OnMenuItemClickListener

















MainActivity.java
public class MainActivity extends ActionBarActivity{
private ActionBar ab;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

ab = getSupportActionBar();
ab.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);//初期画面をStandardで設定

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
//ヘルプメニュー作成
MenuItem _item1 = menu.add(0 , 0 ,0,"Help").setIcon(android.R.drawable.ic_menu_help);
MenuItemCompat.setShowAsAction(_item1, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
_item1.setOnMenuItemClickListener(new OnMenuItemClickListener(){//ヘルプボタンイベントリスナー
@Override
public boolean onMenuItemClick(MenuItem item) {
// TODO 自動生成されたメソッド・スタブ
Toast.makeText(MainActivity.this, "ヘルプ!", Toast.LENGTH_SHORT).show();   
return false;
}
});

//設定メニュー作成
MenuItem _item2 = menu.add(0 , 1 ,0,"Setting").setIcon(android.R.drawable.ic_menu_preferences);
MenuItemCompat.setShowAsAction(_item2, MenuItemCompat.SHOW_AS_ACTION_IF_ROOM);
_item2.setOnMenuItemClickListener(new OnMenuItemClickListener(){//設定ボタンイベントリスナー
@Override
public boolean onMenuItemClick(MenuItem item) {
// TODO 自動生成されたメソッド・スタブ
Toast.makeText(MainActivity.this, "設定!", Toast.LENGTH_SHORT).show();   
return false;
}
});

return true;
}
}



2014年1月1日

2013年さようなら、2014年おはよう!

2014年あけましておめでとうございます!

androidアプリを作り始めて2年が経過し、2013年はアプリ作成に意欲がでた年でもありました。

おかげさまで無料公開中の3アプリは100DLを超えました。

当初100DLがまず夢で作り始めましたが、案外あっさりといきました。

2014年は1000DLを目指してがんばります!

ブログを始めてから初めての年越しとなるので記念にアプリDLと広告収入を公開致します。

なお広告は2013年10月初旬からの現在までの約3ヶ月分です。


アプリ名:体重計アラーム
総DL数:898
有効インストール:173
広告収入:503円
https://play.google.com/store/apps/details?id=bodony.pack.diet&hl=ja


《感想》
マーケットを意識して初めて作成したアプリでした。おかげさまで1000近くはなってきましたが
さすがに公開1年を経過するとほとんど伸びません。有効も173となってますが本当に有効なのは30か40くらいでしょう。






アプリ名:貯めマスっち
総DL数:279
有効インストール:110
広告収入:608円
https://play.google.com/store/apps/details?id=bodony.pack.tamemasucchi&hl=ja


《感想》
真剣に1000DLを狙って年齢層などを気にしてゆるキャラで作成してみました。
広告にも力を入れて、このアプリで初めてアンドロイダーの公認アプリにチャレンジしました。
無事、公認となり順調であったもののDLは伸び悩み現在、1日1~3ほど。





アプリ名:かんたん血圧記録
総DL数:155
有効インストール:54
広告収入:210円
https://play.google.com/store/apps/details?id=bodony.pack.easybloodpressure&hl=ja

《感想》
最初の体重計アラームが予想に反してなかなかのDL数だったので似た機能で血圧バージョンを作成。しかし、シンプルすぎたのか、または年齢層をあげすぎたのか伸びず。




以上!

2013年を振り返るとチャレンジの年でした。
2014年もチャレンジの年とします。

このブログを読んでくださった方々、今年も宜しくお願いしますね!


2013年12月24日

LayoutInflaterとは

LayoutInflater

動的にLayout.xmlファイルをセットすることができる。

セットしてないlayout.xmlの中の要素(TextViewButton)を書き換えたりもできる。

以下ソースでは、初期画面にactivity_main.xmlをセット。

ボタンを押すとactivity_sub.xmlが追加されます。


activity_mainのみ
activity_subを追加

MainActivity.java
public class MainActivity extends Activity implements OnClickListener{
 private LinearLayout _layout;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  Button _button1 = (Button)findViewById(R.id.button1);   
  _button1.setOnClickListener(this);
        
  _layout = (LinearLayout)findViewById(R.id.layout01);
 }

 @Override
 public void onClick(View arg0) {
  // TODO 自動生成されたメソッド・スタブ
  switch(arg0.getId()){
  case R.id.button1:
   //activity_sub.xmlを追加
   _layout.removeAllViews();//layoutを削除
   getLayoutInflater().inflate(R.layout.activity_sub, _layout);
   break;
  }
  
 }
}


res/layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ボタンを押すと下LinerLayoutに追加されます"/>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="XML追加" />

<!--     ↓ここに追加されます -->
    <LinearLayout
        android:id="@+id/layout01"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >
    </LinearLayout>

</LinearLayout>


res/layout/activity_sub.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >
   
    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="テキスト1"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ボタン1" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="テキスト2"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
        android:id="@+id/button3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ボタン2" />
   
</LinearLayout>


2013年12月23日

ContextMenuとは

ContextMenu

長押しされたときに出るポップアップメニューのようなものです。

長押しイベントを登録する際にはregisterForContextMenu(※View);を使用します。

以下ソース例ではListViewContextMenuを登録しています。

ListView
ContextMenu

















MainActivity.java
public class MainActivity extends Activity{
 static final int CONTEXT_MENU1_ID = 0;//ContextMenuアイテムid
 static final int CONTEXT_MENU2_ID = 1;//ContextMenuアイテムid
 private AdapterContextMenuInfo adapterInfo;
 private ListView _contextlistView;
 private String _listitem;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 
  ListView _listview = (ListView) findViewById(R.id.listView1);
 
  String[] _stTest = { "テスト1", "テスト2", "テスト3"};//ListVieの表示アイテム
 
        ArrayAdapter<string> adapter = new ArrayAdapter<string>(this,
                android.R.layout.simple_list_item_1, _stTest);

        _listview.setAdapter(adapter);//アダプターセット
     
        registerForContextMenu(_listview);//ContextMenu登録
     
 }

 public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
     super.onCreateContextMenu(menu, view, info);
     adapterInfo = (AdapterContextMenuInfo) info;
    
     _contextlistView = (ListView) view;
     _listitem = (String) _contextlistView.getItemAtPosition(adapterInfo.position);//list選択アイテム名を取得
    
     menu.setHeaderTitle("menu");//メニュータイトル
     //Menu.add(int groupId, int itemId, int order, CharSequence title)
     menu.add(0,CONTEXT_MENU1_ID,0,"トースト表示(アイテム名)");
     menu.add(0,CONTEXT_MENU2_ID,0,"トースト表示(アイテムid)");
 }
    
     @Override
     public boolean onContextItemSelected(MenuItem item) {//ContextMenuアイテム選択イベント
     switch (item.getItemId()) {
     case CONTEXT_MENU1_ID:
      //選択されたアイテム名表示
      Toast.makeText(this, _listitem, Toast.LENGTH_SHORT).show();
    
     return true;
     case CONTEXT_MENU2_ID:
      //選択されたアイテムid表示
      Toast.makeText(this, String.valueOf(adapterInfo.id), Toast.LENGTH_SHORT).show();
    
     return true;
     default:
     return super.onContextItemSelected(item);
     }
    }
}




res/layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android1="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <TextView
        android1:id="@+id/textView1"
        android1:layout_width="wrap_content"
        android1:layout_height="wrap_content"
        android1:text="ListView"
        android1:textAppearance="?android:attr/textAppearanceLarge" />

    <ListView
        android1:id="@+id/listView1"
        android1:layout_width="match_parent"
        android1:layout_height="wrap_content" >
    </ListView>

</LinearLayout>


2013年12月22日

ContextMenuInfoとは

ContextMenuInfo

ContextMenuアイテムの長押しイベント登録する際に、

選択されたアイテムの情報(位置やid)を取得するために使用します。

長押しイベントを登録する際にはregisterForContextMenu(※View);を使用します。

※以下ソース例ではListViewContextMenuを登録しています。


ListView表示
ContextMenu表示
ContextMenu選択
















MainActivity.java
public class MainActivity extends Activity{
 static final int CONTEXT_MENU1_ID = 0;//ContextMenuアイテムid
 static final int CONTEXT_MENU2_ID = 1;//ContextMenuアイテムid
 private AdapterContextMenuInfo adapterInfo;
 private ListView _contextlistView;
 private String _listitem;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
 
  ListView _listview = (ListView) findViewById(R.id.listView1);
 
  String[] _stTest = { "テスト1", "テスト2", "テスト3"};//ListVieの表示アイテム
 
        ArrayAdapter<string> adapter = new ArrayAdapter<string>(this,
                android.R.layout.simple_list_item_1, _stTest);

        _listview.setAdapter(adapter);//アダプターセット
     
        registerForContextMenu(_listview);//ContextMenu登録
     
 }

 public void onCreateContextMenu(ContextMenu menu, View view, ContextMenuInfo info) {
     super.onCreateContextMenu(menu, view, info);
     adapterInfo = (AdapterContextMenuInfo) info;
    
     _contextlistView = (ListView) view;
     _listitem = (String) _contextlistView.getItemAtPosition(adapterInfo.position);//list選択アイテム名を取得
    
     menu.setHeaderTitle("menu");//メニュータイトル
     //Menu.add(int groupId, int itemId, int order, CharSequence title)
     menu.add(0,CONTEXT_MENU1_ID,0,"トースト表示(アイテム名)");
     menu.add(0,CONTEXT_MENU2_ID,0,"トースト表示(アイテムid)");
 }
    
     @Override
     public boolean onContextItemSelected(MenuItem item) {//ContextMenuアイテム選択イベント
     switch (item.getItemId()) {
     case CONTEXT_MENU1_ID:
      //選択されたアイテム名表示
      Toast.makeText(this, _listitem, Toast.LENGTH_SHORT).show();
    
     return true;
     case CONTEXT_MENU2_ID:
      //選択されたアイテムid表示
      Toast.makeText(this, String.valueOf(adapterInfo.id), Toast.LENGTH_SHORT).show();
    
     return true;
     default:
     return super.onContextItemSelected(item);
     }
    }
}




res/layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:android1="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <TextView
        android1:id="@+id/textView1"
        android1:layout_width="wrap_content"
        android1:layout_height="wrap_content"
        android1:text="ListView"
        android1:textAppearance="?android:attr/textAppearanceLarge" />

    <ListView
        android1:id="@+id/listView1"
        android1:layout_width="match_parent"
        android1:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

2013年12月21日

ActionBarActivityとは

ActionBarActivity

ActionBarはandroid.3.0以降から可能なものですが、下位APIでも使用可能とする為、

support.v7ActionBarを使用するときに必要なものです。

support.v7ActionBarを使用するには、以下決まりごとがあります。
  1. ActionBarActivityをextendsする。
  2. styles.xmlのstyle@style/Theme.AppCompat.Light 又は@style/Theme.AppCompatを設定する。

Standard Navigation
List Navigation
Tab Navigation

















MainActivity.java
public class MainActivity extends ActionBarActivity implements OnClickListener, OnNavigationListener, TabListener{
 private ActionBar ab;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  //getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
  setContentView(R.layout.activity_main);
  
  Button _button_stand = (Button)findViewById(R.id.button_Standard);//Standardモード
  _button_stand.setOnClickListener(this);
  Button _button_list = (Button)findViewById(R.id.button_List);//Listモード
  _button_list.setOnClickListener(this);  
  Button _button_tab = (Button)findViewById(R.id.button_Tab);//tabモード
  _button_tab.setOnClickListener(this); 
  
  ab = getSupportActionBar();
  ab.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);//初期画面をStandardで設定
  
  
 }
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
 // メニューの要素を追加
 getMenuInflater().inflate(R.menu.menu, menu); 
 return true;
 }
 

 @Override
 public void onClick(View arg0) {
  // TODO 自動生成されたメソッド・スタブ
  switch(arg0.getId()){
  case R.id.button_Standard:
   ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_TITLE);//appタイトル表示
   ab.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);//Standardモード
   break;
   
  case R.id.button_List:   
   SpinnerAdapter _Adapter = ArrayAdapter.createFromResource(this,
                 R.array.action_list,
                 android.R.layout.simple_list_item_1);
   ab.setListNavigationCallbacks(_Adapter, this);
   ab.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);//appタイトル非表示
   ab.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);//Listモード
   break;
   
  case R.id.button_Tab:
   ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);//Tabモード
   ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_TITLE);//appタイトル表示
   ab.addTab(ab.newTab().setText("Tab_1").setTabListener(this));
         ab.addTab(ab.newTab().setText("Tab 2").setTabListener(this));
         ab.addTab(ab.newTab().setText("Tab 3").setTabListener(this));   
   break;
  
  }
 }

 @Override
 public boolean onNavigationItemSelected(int arg0, long arg1) {//Listモードのitem選択時アクション
  // TODO 自動生成されたメソッド・スタブ
  return false;
 }

 //以下onTabReselected,onTabSelected,onTabUnselectedはTabモードで必要
 @Override
 public void onTabReselected(Tab arg0, FragmentTransaction arg1) {//tabが2度目以降に選択された場合に実行
  // TODO 自動生成されたメソッド・スタブ
  
 }

 @Override
 public void onTabSelected(Tab arg0, FragmentTransaction arg1) {//tabが選択された場合に実行
  // TODO 自動生成されたメソッド・スタブ
  
 }

 @Override
 public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {//tabが選択から外れた場合に実行
  // TODO 自動生成されたメソッド・スタブ
  
 }
}



res/layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ActionBar3つのモード"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
        android:id="@+id/button_Standard"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Standard Navigation" />

    <Button
        android:id="@+id/button_List"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="List Navigation" />

    <Button
        android:id="@+id/button_Tab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Tab Navigation" />

</LinearLayout>



res/menu/menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">//※この行必須です。
<item android:icon="@android:drawable/ic_menu_help" android:id="@+id/menu1" app:showAsAction="ifRoom" android:title="test">
</item>

<item android:icon="@android:drawable/ic_menu_preferences" android:id="@+id/menu2" app:showAsAction="ifRoom" android:title="@string/menu_settings">
</item>

</menu>



res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">HelloWorld</string>
    <string name="hello_world">Hello world!</string>
    <string name="menu_settings">Settings</string>
    <string-array name="action_list">
        <item>test1</item>
        <item>test2</item>
        <item>test3</item>
        <item>test4</item>
        <item>test5</item>
    </string-array>
</resources>


res/values/styles.xml
<resources>
  //support.v7のActionBarを使用する際は、@style/Theme.AppCompat.Lightか@style/Theme.AppCompatのどちらか必須です。
    <style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light">//※この行必須です。
       
    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
    </style>


</resources>

2013年12月20日

TabListenerとは

TabListener

ActionBarTabを利用したときに使用するものです。

OnClickListenerTabバージョンと思えば良いです。


TabListenerを実装した場合、以下のメソッドが必要になります。
  • onTabReselected・・・Tabが2回目以降に選択された場合に実行される
  • onTabSelected・・・Tabが選択された場合に実行される
  • onTabUnselected・・・Tabが選択から外れた場合に実行される

以下ソース例では下位APIでも利用可とするため

support.v7ActionBarを利用しています。stylesに指定文を書くのを忘れないでください。


Tab 画面2選択
Tab 画面1を選択
















MainActivity.java
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.container);//
ActionBar ab = getSupportActionBar();
// アイコンを表示しない
ab.setDisplayShowHomeEnabled(false);
// SHOW_TITLEのフラグを消すことで、タイトル表示を消す
ab.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);

ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);//tabを利用するときの決まり文句
ab.addTab(ab
.newTab()//新規作成
.setText("画面1")//tab文字
.setTabListener(
new MainTabListener<fragment1>(this, "f1",Fragment1.class)));//読み込むclassを指定
ab.addTab(ab
.newTab()
.setText("画面2")
.setTabListener(
new MainTabListener<fragment2>(this, "f2",Fragment2.class)));
ab.addTab(ab
.newTab()
.setText("画面3")
.setTabListener(
new MainTabListener<fragment3>(this, "f3",Fragment3.class)));

ab.getTabAt(1).select(); // 左:0 中:1 右:2 今回は初期tab選択位置を真ん中に指定

}
public class MainTabListener<t extends="" fragment=""> implements TabListener {

private Fragment fragment;
private final Activity activity;
private final String tag;
private final Class<t> cls;

public MainTabListener(Activity activity, String tag, Class<t> cls) {
this.activity = activity;
this.tag = tag;
this.cls = cls;
}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {//Tabが2回目以降に選択された場合に実行される
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {//Tabが選択された場合に実行される
if (fragment == null) {
fragment = Fragment.instantiate(activity, cls.getName());
ft.replace(R.id.container, fragment, tag);

} else {
fragment = Fragment.instantiate(activity, cls.getName());
ft.replace(R.id.container, fragment, tag);
}
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {//Tabが選択から外れた場合に実行される
if (fragment != null) {
ft.detach(fragment);
   }
  }
 }
}

Fragment1.java (Fragment2、3はほぼ同じ内容なので省きます)
public class Fragment1  extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.frag1, container, false);//レイアウトxmlファイルを指定
}

@Override
public void onStart() {
super.onStart();
//ここに処理内容を記載

}
}
res/layout/container.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

</FrameLayout>
res/layout/frag1.xml (Fragment2、3はほぼ同じ内容なので省きます)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="画面1"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>
res/values/styles.xml
<resources>

    <style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light">//@style/Theme.AppCompatか@style/Theme.AppCompat.Light選択必須

    </style>

    <style name="AppTheme" parent="AppBaseTheme">

    </style>

</resources>

2013年12月18日

Intent画面遷移

Intent画面遷移

Activityへの画面遷移(がめんせんい)にフォーカスを当ててソースを記載してみました。

ボタンがあって画面が切り替われば、よりアプリらしくなってきます。

また他のInten機能については記事:Intentとは を参考にして下さい。

よく忘れがちなものとしてAndroidManifest.xmlに

画面遷移先のAcitivityを登録することがあります。

そのへんも記載します。

画面遷移 Main画面
画面遷移 遷移先A
MainActivity.java
public class MainActivity extends Activity implements OnClickListener{
private Intent intent;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.activity_main);

if(intent != null){
String str = intent.getStringExtra("key");
TextView textview = (TextView)findViewById(R.id.textView1);
textview.setText(str);
}

Button _button_main= (Button)findViewById(R.id.button_main);
_button_main.setOnClickListener(this);
Button _button_a = (Button)findViewById(R.id.button_a);
_button_a.setOnClickListener(this);  
Button _button_b = (Button)findViewById(R.id.button_b);
_button_b.setOnClickListener(this); 
Button _button_c = (Button)findViewById(R.id.button_c);
_button_c.setOnClickListener(this);  

}


@Override
public void onClick(View arg0) {
// TODO 自動生成されたメソッド・スタブ
switch(arg0.getId()){
case R.id.button_main:
//   intent = new Intent();
//          intent.setClass(MainActivity.this,SubActivity.class);
//          intent.putExtra("key", "現在のActivity:A");//putExtra(key,送信したいtext)
//          // 元々のアクティビティを破棄するなら
//          finish(); 
break;

case R.id.button_a:   
intent = new Intent();
intent.setClass(this,Activity_a.class);
intent.putExtra("key", "現在のActivity:A");//putExtra(key,送信したいtext)
//元々のアクティビティを破棄するなら
finish(); 
break;

case R.id.button_b:
intent = new Intent();
intent.setClass(this,Activity_b.class);
intent.putExtra("key", "現在のActivity:B");//putExtra(key,送信したいtext)
//元々のアクティビティを破棄するなら
finish();   
break;

case R.id.button_c:
intent = new Intent();
intent.setClass(this,Activity_c.class);
intent.putExtra("key", "現在のActivity:C");//putExtra(key,送信したいtext)
//元々のアクティビティを破棄するなら
finish();  
break;

}
if (intent != null){
startActivityForResult(intent, 0);//開始
}
}
}


Activity_a.java
public class Activity_a extends Activity implements OnClickListener{
private Intent intent;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.activity_main);
intent = getIntent();
if(intent != null){
String str = intent.getStringExtra("key");
TextView textview = (TextView)findViewById(R.id.textView1);
textview.setText(str);
}
Button _button_main= (Button)findViewById(R.id.button_main);
_button_main.setOnClickListener(this);
Button _button_a = (Button)findViewById(R.id.button_a);
_button_a.setOnClickListener(this);  
Button _button_b = (Button)findViewById(R.id.button_b);
_button_b.setOnClickListener(this); 
Button _button_c = (Button)findViewById(R.id.button_c);
_button_c.setOnClickListener(this);  

}


@Override
public void onClick(View arg0) {
// TODO 自動生成されたメソッド・スタブ
switch(arg0.getId()){
case R.id.button_main:
intent = new Intent();
intent.setClass(this,MainActivity.class);
intent.putExtra("key", "現在のActivity:main");//putExtra(key,送信したいtext)
//元々のアクティビティを破棄するなら
finish(); 
break;

case R.id.button_a:   
//   intent = new Intent();
//            intent.setClass(this,Activity_a.class);
//            intent.putExtra("key", "現在のActivity:A");//putExtra(key,送信したいtext)
//            //元々のアクティビティを破棄するなら
//            finish(); 
break;

case R.id.button_b:
intent = new Intent();
intent.setClass(this,Activity_b.class);
intent.putExtra("key", "現在のActivity:B");//putExtra(key,送信したいtext)
//元々のアクティビティを破棄するなら
finish();   
break;

case R.id.button_c:
intent = new Intent();
intent.setClass(this,Activity_c.class);
intent.putExtra("key", "現在のActivity:C");//putExtra(key,送信したいtext)
//元々のアクティビティを破棄するなら
finish();    
break;
}
if (intent != null){
startActivityForResult(intent, 0);//開始
}
}
}


Activity_b.java
public class Activity_b extends Activity implements OnClickListener{
private Intent intent;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.activity_main);
intent = getIntent();
if(intent != null){
String str = intent.getStringExtra("key");
TextView textview = (TextView)findViewById(R.id.textView1);
textview.setText(str);
}
Button _button_main= (Button)findViewById(R.id.button_main);
_button_main.setOnClickListener(this);
Button _button_a = (Button)findViewById(R.id.button_a);
_button_a.setOnClickListener(this);  
Button _button_b = (Button)findViewById(R.id.button_b);
_button_b.setOnClickListener(this); 
Button _button_c = (Button)findViewById(R.id.button_c);
_button_c.setOnClickListener(this);  

}


@Override
public void onClick(View arg0) {
// TODO 自動生成されたメソッド・スタブ
switch(arg0.getId()){
case R.id.button_main:
intent = new Intent();
intent.setClass(this,MainActivity.class);
intent.putExtra("key", "現在のActivity:main");//putExtra(key,送信したいtext)
//元々のアクティビティを破棄するなら
finish(); 
break;

case R.id.button_a:   
intent = new Intent();
intent.setClass(this,Activity_a.class);
intent.putExtra("key", "現在のActivity:A");//putExtra(key,送信したいtext)
//元々のアクティビティを破棄するなら
finish(); 
break;

case R.id.button_b:
//   intent = new Intent();
//            intent.setClass(this,Activity_b.class);
//            intent.putExtra("key", "現在のActivity:B");//putExtra(key,送信したいtext)
//            //元々のアクティビティを破棄するなら
//            finish();   
break;

case R.id.button_c:
intent = new Intent();
intent.setClass(this,Activity_c.class);
intent.putExtra("key", "現在のActivity:C");//putExtra(key,送信したいtext)
//元々のアクティビティを破棄するなら
finish();    
break;
}
if (intent != null){
startActivityForResult(intent, 0);//開始
}
}
}


Activity_c.java
public class Activity_c extends Activity implements OnClickListener{
private Intent intent;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
setContentView(R.layout.activity_main);
intent = getIntent();
if(intent != null){
String str = intent.getStringExtra("key");
TextView textview = (TextView)findViewById(R.id.textView1);
textview.setText(str);
}
Button _button_main= (Button)findViewById(R.id.button_main);
_button_main.setOnClickListener(this);
Button _button_a = (Button)findViewById(R.id.button_a);
_button_a.setOnClickListener(this);  
Button _button_b = (Button)findViewById(R.id.button_b);
_button_b.setOnClickListener(this); 
Button _button_c = (Button)findViewById(R.id.button_c);
_button_c.setOnClickListener(this);  

}


@Override
public void onClick(View arg0) {
// TODO 自動生成されたメソッド・スタブ
switch(arg0.getId()){
case R.id.button_main:
intent = new Intent();
intent.setClass(this,MainActivity.class);
intent.putExtra("key", "現在のActivity:main");//putExtra(key,送信したいtext)
//元々のアクティビティを破棄するなら
finish(); 
break;

case R.id.button_a:   
intent = new Intent();
intent.setClass(this,Activity_a.class);
intent.putExtra("key", "現在のActivity:A");//putExtra(key,送信したいtext)
//元々のアクティビティを破棄するなら
finish(); 
break;

case R.id.button_b:
intent = new Intent();
intent.setClass(this,Activity_b.class);
intent.putExtra("key", "現在のActivity:B");//putExtra(key,送信したいtext)
//元々のアクティビティを破棄するなら
finish();   
break;

case R.id.button_c:
//   intent = new Intent();
//            intent.setClass(this,Activity_c.class);
//            intent.putExtra("key", "現在のActivity:C");//putExtra(key,送信したいtext)
//            //元々のアクティビティを破棄するなら
//            finish();    
break;
}
if (intent != null){
startActivityForResult(intent, 0);//開始
}
}
}



res/layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="現在のActivity:main"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
        android:id="@+id/button_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Activity_Main" />

    <Button
        android:id="@+id/button_a"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Activity_A" />

    <Button
        android:id="@+id/button_b"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Activity_B" />
   
    <Button
        android:id="@+id/button_c"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Activity_C" />
</LinearLayout>



res/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="sample.helloworld"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="sample.helloworld.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
       
<!--         画面遷移でActivityを追加する場合は必ずマニフェストにも追加 -->
        <activity android:name=".Activity_a"></activity>
        <activity android:name=".Activity_b"></activity>
        <activity android:name=".Activity_c"></activity>
     
    </application>

</manifest>

ActionBar.Tabとは

ActionBar.Tab

ActionBarを利用したTabナビゲーションです。

便利系アプリとかではグっとアプリっぽくさせることができます?!

Fragnmentを学ぶ必要があります。

筆者は、他参考サイトでのソースをコピーしながら覚えましたが

どうも自分の場合、他サイトのソースをそのままコピーしてもうまく動かなかったり

Fragmentが重なって表示されたり、と色々トラブルが起こり、

Tabだけで10時間くらい試行錯誤した記憶があります。

最終的に辿り着いたソースの形です。なお下位APIでも利用可とするため

support.v7ActionBarを利用しているため、stylesに指定文を書くのを忘れないでください。

同じことに悩まされた人は一旦ここのソースコピーしてもらえれば思った動きになるかもしれません

Tab 画面2選択
Tab 画面1を選択
















MainActivity.java
public class MainActivity extends ActionBarActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.container);//
ActionBar ab = getSupportActionBar();
// アイコンを表示しない
ab.setDisplayShowHomeEnabled(false);
// SHOW_TITLEのフラグを消すことで、タイトル表示を消す
ab.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);

ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);//tabを利用するときの決まり文句
ab.addTab(ab
.newTab()//新規作成
.setText("画面1")//tab文字
.setTabListener(
new MainTabListener<fragment1>(this, "f1",Fragment1.class)));//読み込むclassを指定
ab.addTab(ab
.newTab()
.setText("画面2")
.setTabListener(
new MainTabListener<fragment2>(this, "f2",Fragment2.class)));
ab.addTab(ab
.newTab()
.setText("画面3")
.setTabListener(
new MainTabListener<fragment3>(this, "f3",Fragment3.class)));

ab.getTabAt(1).select(); // 左:0 中:1 右:2 今回は初期tab選択位置を真ん中に指定

}
public class MainTabListener<t extends="" fragment=""> implements TabListener {

private Fragment fragment;
private final Activity activity;
private final String tag;
private final Class<t> cls;

public MainTabListener(Activity activity, String tag, Class<t> cls) {
this.activity = activity;
this.tag = tag;
this.cls = cls;
}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}

@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
if (fragment == null) {
fragment = Fragment.instantiate(activity, cls.getName());
ft.replace(R.id.container, fragment, tag);

} else {
fragment = Fragment.instantiate(activity, cls.getName());
ft.replace(R.id.container, fragment, tag);
}
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
if (fragment != null) {
ft.detach(fragment);
   }
  }
 }
}

Fragment1.java (Fragment2、3はほぼ同じ内容なので省きます)
public class Fragment1  extends Fragment{
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.frag1, container, false);//レイアウトxmlファイルを指定
}

@Override
public void onStart() {
super.onStart();
//ここに処理内容を記載

}
}
res/layout/container.xml
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

</FrameLayout>
res/layout/frag1.xml (Fragment2、3はほぼ同じ内容なので省きます)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="画面1"
        android:textAppearance="?android:attr/textAppearanceLarge" />

</LinearLayout>
res/values/styles.xml
<resources>

    <style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light">//@style/Theme.AppCompatか@style/Theme.AppCompat.Light選択必須

    </style>

    <style name="AppTheme" parent="AppBaseTheme">

    </style>

</resources>

ActionBarとは

ActionBar

これまでのオプションメニューに変わるものです。

ナビゲーションモードで以下3つがあります。
1つのActivityで選択できるのは上記モードのうち1つだけです。

Android 3.0以降で使用可能ですが、ここでは下位APIでも使用可能とする為、

support.v7を導入したソース例を記載します。通常のActionBarの書き方と違うので注意して下さい。

※特にmenu,stylesは指定文があります。

Standard Navigation
List Navigation
Tab Navigation

















MainActivity.java
public class MainActivity extends ActionBarActivity implements OnClickListener, OnNavigationListener, TabListener{
 private ActionBar ab;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  //getWindow().requestFeature(Window.FEATURE_ACTION_BAR);
  setContentView(R.layout.activity_main);
  
  Button _button_stand = (Button)findViewById(R.id.button_Standard);//Standardモード
  _button_stand.setOnClickListener(this);
  Button _button_list = (Button)findViewById(R.id.button_List);//Listモード
  _button_list.setOnClickListener(this);  
  Button _button_tab = (Button)findViewById(R.id.button_Tab);//tabモード
  _button_tab.setOnClickListener(this); 
  
  ab = getSupportActionBar();
  ab.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);//初期画面をStandardで設定
  
  
 }
 
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
 // メニューの要素を追加
 getMenuInflater().inflate(R.menu.menu, menu); 
 return true;
 }
 

 @Override
 public void onClick(View arg0) {
  // TODO 自動生成されたメソッド・スタブ
  switch(arg0.getId()){
  case R.id.button_Standard:
   ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_TITLE);//appタイトル表示
   ab.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);//Standardモード
   break;
   
  case R.id.button_List:   
   SpinnerAdapter _Adapter = ArrayAdapter.createFromResource(this,
                 R.array.action_list,
                 android.R.layout.simple_list_item_1);
   ab.setListNavigationCallbacks(_Adapter, this);
   ab.setDisplayOptions(0, ActionBar.DISPLAY_SHOW_TITLE);//appタイトル非表示
   ab.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);//Listモード
   break;
   
  case R.id.button_Tab:
   ab.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);//Tabモード
   ab.setDisplayOptions(ActionBar.DISPLAY_SHOW_TITLE, ActionBar.DISPLAY_SHOW_TITLE);//appタイトル表示
   ab.addTab(ab.newTab().setText("Tab_1").setTabListener(this));
         ab.addTab(ab.newTab().setText("Tab 2").setTabListener(this));
         ab.addTab(ab.newTab().setText("Tab 3").setTabListener(this));   
   break;
  
  }
 }

 @Override
 public boolean onNavigationItemSelected(int arg0, long arg1) {//Listモードのitem選択時アクション
  // TODO 自動生成されたメソッド・スタブ
  return false;
 }

 //以下onTabReselected,onTabSelected,onTabUnselectedはTabモードで必要
 @Override
 public void onTabReselected(Tab arg0, FragmentTransaction arg1) {//tabが2度目以降に選択された場合に実行
  // TODO 自動生成されたメソッド・スタブ
  
 }

 @Override
 public void onTabSelected(Tab arg0, FragmentTransaction arg1) {//tabが選択された場合に実行
  // TODO 自動生成されたメソッド・スタブ
  
 }

 @Override
 public void onTabUnselected(Tab arg0, FragmentTransaction arg1) {//tabが選択から外れた場合に実行
  // TODO 自動生成されたメソッド・スタブ
  
 }
}



res/layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="ActionBar3つのモード"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <Button
        android:id="@+id/button_Standard"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Standard Navigation" />

    <Button
        android:id="@+id/button_List"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="List Navigation" />

    <Button
        android:id="@+id/button_Tab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Tab Navigation" />

</LinearLayout>



res/menu/menu.xml
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">//※この行必須です。
<item android:icon="@android:drawable/ic_menu_help" android:id="@+id/menu1" app:showAsAction="ifRoom" android:title="test">
</item>

<item android:icon="@android:drawable/ic_menu_preferences" android:id="@+id/menu2" app:showAsAction="ifRoom" android:title="@string/menu_settings">
</item>

</menu>



res/values/strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>

    <string name="app_name">HelloWorld</string>
    <string name="hello_world">Hello world!</string>
    <string name="menu_settings">Settings</string>
    <string-array name="action_list">
        <item>test1</item>
        <item>test2</item>
        <item>test3</item>
        <item>test4</item>
        <item>test5</item>
    </string-array>
</resources>


res/values/styles.xml
<resources>
  //support.v7のActionBarを使用する際は、@style/Theme.AppCompat.Lightか@style/Theme.AppCompatのどちらか必須です。
    <style name="AppBaseTheme" parent="@style/Theme.AppCompat.Light">//※この行必須です。
       
    </style>

    <!-- Application theme. -->
    <style name="AppTheme" parent="AppBaseTheme">
    </style>


</resources>