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>

2013年12月17日

SimpleCursorAdapterとは

SimpleCursorAdapter

SQLiteDatabaseを使用した大量のデータをListViewなどに列挙するときに使用する。

シンプル簡単にできるクラスとしてSimpleCursorAdapterがあります。

なお筆者は下位APIでも使用可能とする為、support.v4SimpleCursorAdapterをインポートしてます。


図1 SQLiteDatabase
図2 SimpleCursorAdapter
DatabaseOpenHelper.java
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseOpenHelper extends SQLiteOpenHelper {
 private static final String DB_NAME = "DataBese.db";// データベース名
 // バージョンを変更するとonUpgrade()が呼ばれる
 private final static int DB_VER = 1;//データベースバージョン
 public static final String TABLE_NAME = "DataBaseTable";// テーブル名
 
    // 列名(column)
 public static final String COLUMN_ID = "_id";//id
 public static final String COLUMN_DATE = "_date";//日付
 public static final String COLUMN_WEIGHT = "_weight";//体重

public DatabaseOpenHelper(Context context) {
    // 指定したデータベース名が存在しない場合、onCreate()が呼ばれる
 super(context, DB_NAME, null, DB_VER);
 }
 @Override
 public void onCreate(SQLiteDatabase db) {
  db.beginTransaction();
  try{
   // テーブルの生成
      StringBuilder createSql = new StringBuilder();
      createSql.append("create table " + TABLE_NAME + " (");
      createSql.append(COLUMN_ID + " integer primary key autoincrement,");//id、自動ナンバリング
      createSql.append(COLUMN_DATE + " text,");//日付、string型
      createSql.append(COLUMN_WEIGHT + " text");//体重、string型
      createSql.append(")");
      db.execSQL( createSql.toString());
      db.setTransactionSuccessful();
      } finally {
      db.endTransaction();
      }
    }
 
 
 //データベースの更新
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  // データベースのバージョン変更で呼び出される。
  //例:データ引継ぎ等はここに記載
 }
}


MainActivity.java
import android.os.Bundle;
import android.support.v4.widget.CursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class MainActivity extends Activity implements OnClickListener{

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  Button button = (Button)findViewById(R.id.button_00);
  button.setOnClickListener(this);
  
  listload();//データベース内容をlistviewに表示
 }

 @Override
 public void onClick(View view) {
  // TODO 自動生成されたメソッド・スタブ
        //②データベースを開く 
  SQLiteDatabase db = (new DatabaseOpenHelper(this)).getWritableDatabase();
  ContentValues values = new ContentValues();//③オブジェクトの作成
  values.put("_date", "12月1日");//④データ格納("カラム名","登録したい値"
  values.put("_weight", "84kg");//("カラム名","登録したい値"
  
  long ret;   
        try {
      //⑤データを追加する("データベーステーブル名",null,"putで設定した値")   
            ret = db.insert("DataBaseTable", null, values);
        } finally {   
            db.close();
        }   
        if (ret == -1) {   
            Toast.makeText(this, "データベース登録に失敗しました", Toast.LENGTH_SHORT).show();   
        } else {    
            Toast.makeText(this, "データベースに登録しました", Toast.LENGTH_SHORT).show();     
        }
        db.close();//データベースを閉じる
        listload();
 }
 
 private void listload() {
  // TODO 自動生成されたメソッド・スタブ
  SQLiteDatabase db = (new DatabaseOpenHelper(this)).getWritableDatabase();
  ListView list = (ListView)findViewById(R.id.datalist);
  Cursor cursor = db.query("DataBaseTable", null, null, null, null, null, null); 
  list.setAdapter(new SimpleCursorAdapter(this,
                                 R.layout.list_item,cursor,
                                 new String[] {"_id","_date","_weight"},
                                 new int[] {R.id.id,R.id.date,R.id.weight},CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER));
        db.close();
 }
}

res/layout/activity_main.xml
<RelativeLayout 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"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="ボタンを押してね" />


    <Button
        android:id="@+id/button_00"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:text="データベース登録" />

     <ListView
         android:id="@+id/datalist"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:layout_alignParentLeft="true"
         android:layout_below="@+id/button_00" >

     </ListView>

</RelativeLayout>


res/layout/list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="8dp">

    <TextView
        android:id="@+id/weight"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/weight_name"
        android:layout_alignBottom="@+id/weight_name"
        android:layout_alignParentRight="true"
        android:text="0kg" />

    <TextView
        android:id="@+id/weight_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/id_name"
        android:layout_alignBottom="@+id/id_name"
        android:layout_toLeftOf="@+id/weight"
        android:text="体重:" />



    <TextView
        android:id="@+id/date_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/weight_name"
        android:layout_alignBottom="@+id/weight_name"
        android:layout_centerHorizontal="true"
        android:text="日付:" />

    <TextView
        android:id="@+id/date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/date_name"
        android:layout_alignBottom="@+id/date_name"
        android:layout_toRightOf="@+id/date_name"
        android:text="日" />

    <TextView
        android:id="@+id/id_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="id番号:" />

    <TextView
        android:id="@+id/id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/id_name"
        android:layout_alignBottom="@+id/id_name"
        android:layout_toRightOf="@+id/id_name"
        android:text="id" />
   
</RelativeLayout>

2013年12月15日

CursorAdapterとは

CursorAdapter

SQLiteDatabaseを使用した大量のデータをListViewなどに列挙するときに使用する。

シンプル簡単にできるクラスとしてSimpleCursorAdapterがあります。

以下ソースはSimpleCursorAdapterを例として記載します。

なお筆者は下位APIでも使用可能とする為、support.v4SimpleCursorAdapterをインポートしてます。


図1 SQLiteDatabase
図2 SimpleCursorAdapter
DatabaseOpenHelper.java
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseOpenHelper extends SQLiteOpenHelper {
 private static final String DB_NAME = "DataBese.db";// データベース名
 // バージョンを変更するとonUpgrade()が呼ばれる
 private final static int DB_VER = 1;//データベースバージョン
 public static final String TABLE_NAME = "DataBaseTable";// テーブル名
 
    // 列名(column)
 public static final String COLUMN_ID = "_id";//id
 public static final String COLUMN_DATE = "_date";//日付
 public static final String COLUMN_WEIGHT = "_weight";//体重

public DatabaseOpenHelper(Context context) {
    // 指定したデータベース名が存在しない場合、onCreate()が呼ばれる
 super(context, DB_NAME, null, DB_VER);
 }
 @Override
 public void onCreate(SQLiteDatabase db) {
  db.beginTransaction();
  try{
   // テーブルの生成
      StringBuilder createSql = new StringBuilder();
      createSql.append("create table " + TABLE_NAME + " (");
      createSql.append(COLUMN_ID + " integer primary key autoincrement,");//id、自動ナンバリング
      createSql.append(COLUMN_DATE + " text,");//日付、string型
      createSql.append(COLUMN_WEIGHT + " text");//体重、string型
      createSql.append(")");
      db.execSQL( createSql.toString());
      db.setTransactionSuccessful();
      } finally {
      db.endTransaction();
      }
    }
 
 
 //データベースの更新
 @Override
 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  // データベースのバージョン変更で呼び出される。
  //例:データ引継ぎ等はここに記載
 }
}


MainActivity.java
import android.os.Bundle;
import android.support.v4.widget.CursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Toast;
import android.app.Activity;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class MainActivity extends Activity implements OnClickListener{

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  
  Button button = (Button)findViewById(R.id.button_00);
  button.setOnClickListener(this);
  
  listload();//データベース内容をlistviewに表示
 }

 @Override
 public void onClick(View view) {
  // TODO 自動生成されたメソッド・スタブ
        //②データベースを開く 
  SQLiteDatabase db = (new DatabaseOpenHelper(this)).getWritableDatabase();
  ContentValues values = new ContentValues();//③オブジェクトの作成
  values.put("_date", "12月1日");//④データ格納("カラム名","登録したい値"
  values.put("_weight", "84kg");//("カラム名","登録したい値"
  
  long ret;   
        try {
      //⑤データを追加する("データベーステーブル名",null,"putで設定した値")   
            ret = db.insert("DataBaseTable", null, values);
        } finally {   
            db.close();
        }   
        if (ret == -1) {   
            Toast.makeText(this, "データベース登録に失敗しました", Toast.LENGTH_SHORT).show();   
        } else {    
            Toast.makeText(this, "データベースに登録しました", Toast.LENGTH_SHORT).show();     
        }
        db.close();//データベースを閉じる
        listload();
 }
 
 private void listload() {
  // TODO 自動生成されたメソッド・スタブ
  SQLiteDatabase db = (new DatabaseOpenHelper(this)).getWritableDatabase();
  ListView list = (ListView)findViewById(R.id.datalist);
  Cursor cursor = db.query("DataBaseTable", null, null, null, null, null, null); 
  list.setAdapter(new SimpleCursorAdapter(this,
                                 R.layout.list_item,cursor,
                                 new String[] {"_id","_date","_weight"},//, "position", "number"
                                 new int[] {R.id.id,R.id.date,R.id.weight},CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER));
        db.close();
 }
}

res/layout/activity_main.xml
<RelativeLayout 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"
    tools:context=".MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="ボタンを押してね" />


    <Button
        android:id="@+id/button_00"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView1"
        android:layout_centerHorizontal="true"
        android:text="データベース登録" />

     <ListView
         android:id="@+id/datalist"
         android:layout_width="fill_parent"
         android:layout_height="fill_parent"
         android:layout_alignParentLeft="true"
         android:layout_below="@+id/button_00" >

     </ListView>

</RelativeLayout>


res/layout/list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="8dp">

    <TextView
        android:id="@+id/weight"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/weight_name"
        android:layout_alignBottom="@+id/weight_name"
        android:layout_alignParentRight="true"
        android:text="0kg" />

    <TextView
        android:id="@+id/weight_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/id_name"
        android:layout_alignBottom="@+id/id_name"
        android:layout_toLeftOf="@+id/weight"
        android:text="体重:" />



    <TextView
        android:id="@+id/date_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/weight_name"
        android:layout_alignBottom="@+id/weight_name"
        android:layout_centerHorizontal="true"
        android:text="日付:" />

    <TextView
        android:id="@+id/date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/date_name"
        android:layout_alignBottom="@+id/date_name"
        android:layout_toRightOf="@+id/date_name"
        android:text="日" />

    <TextView
        android:id="@+id/id_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="id番号:" />

    <TextView
        android:id="@+id/id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/id_name"
        android:layout_alignBottom="@+id/id_name"
        android:layout_toRightOf="@+id/id_name"
        android:text="id" />
   
</RelativeLayout>

Fragmentとは

Fragment

Fragmentがサポートされる前まではActivity自身を切り替え(intent画面遷移)をしてましたが

Tab利用で画面切り替えをするときにFragmentを利用します。

ホームページを作成された方であればフレーム(frame)と思えば分かり良いと思います。

分かりにくい人は以下ソースを参照してもらえれば雰囲気がつかめるはずです。

なお参考ソースは下位APIでも利用可能とする為、support.v4support.v7を利用しています。

事前に設定が必要です。


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>

support.v7とは

support.v7

下位APIでもActionBar等を使用可能にするサポートです。

Fragmentsupport.v4でサポートされます。

色んな端末、さまざまなバージョンが存在するandroidではサポートライブラリの利用は、必須かと思います。

support.v4,v7ともに設定しておきましょう。

support.v4とは設定方法が違うので注意です。
  1. Android SDK Maneger起動
  2. Extras/Android Support Libraryを最新アップデート
  3. <sdk>/extras/android/support/v7/appcompat/ をインポートしてプロジェクトを作成
  4. 利用したいプロジェクトを右クリック→プロパティー
  5. Androidを選択
  6. ライブラリー→追加を選択
  7. インポートした「android-support-v7-appcompat」のプロジェクトを選択
1.Android SDK Maneger起動
2.Extras/Android Support Libraryを最新アップデートします。

ファイル→インポート選択
Existing Android Code Into Workspaceを選択
3.<sdk>/extras/android/support/v7/appcompat/ をインポートしてプロジェクトを作成
4.利用したいプロジェクトを右クリック→プロパティー
5.Androidを選択
6.ライブラリー→追加を選択
7.インポートした「android-support-v7-appcompat」のプロジェクトを選択
設定完了
以上です。