ActionBarへ戻る機能の追加

ActionBarへ戻る機能の追加

メモ帳アプリとかだと頻繁についている機能
あるとハードウェアの戻るボタンではなく
画面で操作できるのがメリット

ActionBarに戻るボタンを設定するには
Javaで行う

まず、onCreate()の中へコード追加

Button btn = new Button(this);
btn.setText("新規画面を開く");
btn.setOnClickListener(this);

setContentView(btn);

ActionBar actionbar = new ActionBar();
actionbar.setHomeButtonEnabled(true);
actionbar.setDisplayHomeAsUpEnabled(true);

次に、ボタン関連のソースを追加

@Override
public boolean onOptionsItemSelected(MenuItem item){

int itemId = item.getItemId();
if(itemId == android.R.id.home){
finish();
}
return super.onOptionsItemSelected(item);

}

@Override
public void onClick(View v){
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
}

戻るボタンの設定は
setHomeButtonEnabled()

true
をセットすることで
ActionBarのアイコンをタップしたときのイベントが検出できるようになる

タップしたときのイベントは
onOptionsItemSelected()で取得できる

また setDisplayHomeAsUpEnabled()
を使えば、
ActionBarに戻る矢印を追加できる

R言語の変数とデータ型

R言語の変数とデータ型

変数についてはいれものと考えればOK
基本は他の言語と変わらない

ただし書き方が違う

x=5

x <- 5

と書く

これで x とすれば

> x
[1] 5

となる

あと ruby とか シェルみたいにスペースはあけなくてもよいようだ

x+3とすれば

> x+3
[1] 8

となる

今ある変数を表示するなら

ls()

とすればOK

そして実行環境から変数を削除するには
rm() を使う
今回なら rm(x)

これで再度 ls() を実行すると

> ls()
character(0)

となり何もないことがわかる

つまり表示は ls()
削除は rm()

R言語で使えるデータ型は
数値
文字列
ベクトル
行列
リスト
データフレーム
が使える

あとは
NULL
TRUE/FALSE
そして欠損を意味する NA
がある

データの中で取得できなかったデータがあったときに
それを0とか変な数値で代替すると
平均がくるってしまうので
Rではデータ取得がない場合NAを使うことになる

また非数を意味する NaN
がある

Inf なら無限大を意味する

非数についてわからなかったので調べたら
http://e-words.jp/w/E99D9EE695B0.html
によれば
演算結果が正常な結果でないことを示すこと

0で割ったり
負の値の指数を求めると結果が無限大とか定義できない値になるので
こんなときにはNaN になる

R言語について

R言語について

R言語は統計解析用のプログラミング言語

とりあえず統計学はやらずツールの使い方

公式サイトは
http://www.r-project.org/

マニュアルについては
Documantation の Manuals を見ればOK
http://www.r-project.org/

ダウンロードするならCRAN から
http://cran.r-project.org/mirrors.html

ドットインストールでMac でのインストールなので
私の場合 Ubuntu でのインストールなので

ubuntu R言語
で検索し

UbuntuにR言語をインストール

を参考にインストール

最新版を試したいのなら別の方法で
とりあえず

sudo apt-get install r-cran-*

で全パッケージインストール

Rコンソールの使い方は
端末で

R

と入力すればOK

このRコンソールでは
オブジェクト
定義して終了時にソースコードでは
保管せずにまるごとイメージで保存できる

このためイメージを保存する作業ディレクトリが重要になる

通常はプロジェクトごとに作業ディレクトリを変えることになるので

mkdir R_Lessons

で作成

次に
起動時にこのディレクトリを参照するようにしたいのだが
ドットインストールではMac であり
ubuntu ではない

とりあえず
R commander というものがあり
これでできそうなので
R commander 設定 ubuntu
で検索

検索の結果
Rprofile
を編集すればよいみたい

http://stat.biopapyrus.net/dev/rprofile.html
によれば

R が起動すると自動的に
.Rprofile というファイルが読み込まれる

毎回行っている作業
ディレクトリの移動
よく使うライブラリーの呼び出しなどを
.Rprofile に書き込むことによって、自動化される

とのこと
しかし

ls -la 

でみても存在しないので
rprofile作り方
で検索

R起動時に特定の処理を毎回実行する

を参考に
R を起動して

getwd()

として
ディレクトリを表示

> getwd()
[1] "/home/snowpool"

となったので

 touch .Rprofile

でファイル作成

これで設定ファイルができたので
http://stat.biopapyrus.net/dev/rprofile.html
を参考に
作業ディレクトリを変更する

setwd("/home/snowpool/R_lessons/")

として保存

これで再度
R
として

getwd()

とすると

> getwd()
[1] "/home/snowpool/R_lessons"

となり
作業ディレクトリが変更されているのがわかる

モーダルダイアログ作成

モーダルダイアログ作成

モーダルダイアログは、ダイアログを消すまで他の部分を押せなくする表示方法

ユーザー登録とかログインのダイアログで使われる

これを実装するには

ダイアログ生成時に
AlertDialog.setCancelable
に false を設定することで実現できる

ソースにすると

AlertDialog.Builder alertDlg = new AlertDialog.Builder(this).setCancelable(false);
//タイトル設定
alertDlg.setTitle("モーダルダイアログ");
//本文設定
alertDlg.setMessage("本文");
//OKボタン設定
alertDlg.setPositiveButton("ok",new DialogInterface.OnClickListener(){

public void onClick(DialogInterface dialog, int which){
//今回は何もしない
}
});

//モーダルダイアログの表示
alertDlg.create().show();

これでモーダルダイアログが表示される

テキスト入力つきのダイアログ作成

テキスト入力つきのダイアログ作成

コメント欄とかをつけたダイアログ作成に使う

TwitterとかFacebookなどの投稿にも使えるし、メールアプリなどに使うのもわかりやすくなる

テキスト入力つきダイアログ作成するには
EditTextを表示できるレイアウトを作成し
setView()でAlertDialogのコンテンツとして割り当てる

まずは、レイアウトファイルを作成し
テキスト入力用のレイアウトを作成

<LinearLayout
xmlns:android="http://scheams.android.com/apk/res/android"
android:id="@+id/layout_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="10dp">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Tweet !"/>

<EditText
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="match_parent"/>

</LinearLayout>

次に、JavaでAlertDialog.Builderの設定

//カスタムビューの設定
LayoutInflater inflater = (LayoutInflater)this.getSystemService(LAYOUT_INFLATER_SERVICE);

final View layout = (LinearLayout)findViewById(R.id.layout_root);

//AlertDialog生成
AlertDialog.Builder builder = new AlertDialog.Builder(this);

//タイトル設定
builder.setTitle("Tweet Dialog");

//レイアウト設定
builder.setView(layout);

//OKボタン設定
builder.setPositiveButton("ok",new OnClickListener(){
public void onClick(DialogInterface dialog, int which){
EditText tweet = (EditText)findViewById(R.id.text);
String string = tweet.getText().toString();
}
});


//Cancelボタン設定
builder.setNegativeButton("cancel",new OnClickListener(){
public void onClick(DialogInterface dialog, int which){
//キャンセルなので何もしない
}
});

//ダイアログの表示
builder.create().show();

ダイアログの作り方は
作成したレイアウトを
LayoutInflater.inflate()で読み込んで
AlertDialog.setView()
でAlertDialogのコンテンツに割り当てている

ボタンつきのダイアログ作成

ボタンつきのダイアログ作成

よくあるものとしては
Yes/No Ok/Cancel
を選択するダイアログの表示に使われる
これは使用頻度が多く
ユーザー登録とかアプリの権限取得
ネットワーク接続など
いろんな使い道がある

ボタンつきダイアログ作成するには
AlertDialogを使うことでできる

ボタンつきダイアログの作成はJavaで行う

AlertDialog.Builder alertDlg = new AlertDialog.Builder(this);

//タイトル設定
alertDlg.setTitle("Dialog Title");
//本文設定
alertDlg.setMessage("本文");

//okボタンクリック時
alertDlg.setPositiveButton("OK",new DialogInterface.OnClickListener(){

public void onClick(DialogInterface dialog, int which){

}
});

//キャンセルボタンクリック時
alertDlg.setNegativeButton("Cancel",new DialogInterface.OnClickListener(){

public void onClick(DialogInterface dialog, int which){
}
});

alertDlg.create().show();

AlertDialog.Builderで
AlertDialogを生成し、タイトルやメッセージ、ボタンをセットしていく

高速スクローラの追加

高速スクローラの追加

ListViewを高速でスクロールしたいときに設置する

YouTubeとかTwitterクライアントアプリ作るなら必要になるし
データベース連携するときにも使うことになる

高速スクローラを追加するには
setFastScrollEnabled()で
高速スクローラを有効にする

有効にすると、
スクロールするコンテンツのボリュームに関係なく全体に対しての割合でスクロールが可能になる

かなり長いものをずっとスクロールし続けなくてよいので
操作のストレスを減らせる

これを設置すると、スクロールバーみたいなのができる

まずは、レイアウトファイルで画面を作成

<LinearLayout 
xmlns:android="http://scheams.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">

<Switch
android:id="@+id/switch"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="高速スクロール"/>

<ListView
android:id="@+id/list"
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"/>

</LinearLayout>

次に、Javaで高速スクローラの有効化

final ListView list = (ListView)findViewById(R.id.list);
list.setFastScrollEnabled(isChecked);
list.setFastScrollAlwaysVisible(isChecked);

setFastScrollEnabled()にtrueを設定すると
高速スクローラが有効化される

高速スクローラは、しばらくすると消えてしまうので
setFastScrollAlwaysVisible()で
高速スクローラを、常時表示にしている

画面の横スクロール

画面の横スクロール

画面を横にスクロールするには
HorizontalScrollViewを使う

HorizontalScrollViewは
ScrollViewと同じ要領で配置できる

HorizontalScrollViewは
画面を横にスクロールするViewGroup

使い道としては、
Google Playでアプリの紹介や解説のようにプレビューを作ったり
ギャラリーでサンプル表示などに使える

HorizontalScrollViewを配置するには
レイアウトファイルで配置すればok

<HorizontalScrollView
xmlns:android="http://scheams.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="horizontal">

<View
android:layout_width="@dimen/scroll_vertical_view"
android:layout_height="@dimen/scroll_vertical_view"
android:layout_margin="@dimen/padding_large"
android:background="@color/FlatLightAqua"/>

</LinearLayout>

</HorizontalScrollView>

HorizontalScrollViewを扱うときの注意点としては
HorizontalScrollViewの直下に
Viewの配置はできない

必ずViewGroup、つまり
LinearLayoutとかRelativeLayoutなどを設定して
その中へViewを配置すること

画像の縦スクロール

画像の縦スクロール

これは、コンテンツが表示しきれずに画面を縦スクロールするときに使う

ほとんどのお店や買い物リストなどの情報を扱うアプリでは使うことが多い

画面を縦スクロールするためには
ScrollViewを使う

ScrollViewを使うことで
内包するレイアウトはスクロール対象となり画面からはみ出る高さの場合
スクロールして表示される

例えば、YouTubeの場合
動画はそのままだけど
コメント欄はスクロール対象となるなど
常時見せたいコンテンツと解説
みたいなものを作るときに使える

まずは、レイアウトファイルで設定する

<ScrollView
xmlns:android="http://scheams.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent">

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:orientation="vertical">

<View
android:layout_width="@dimen/scroll_vertical_view"
android:layout_height="@dimen/scroll_vertical_view"
android:layout_margin="@dimen/padding_large"
android:background="@color/FlatLightAqua"/>
</LinearLayout>
</ScrollView>

これで、縦スクロールが可能になる

ただし
ScrollViewがスクロールできるのは
ViewGroupを継承したクラスだけになる
このため
LinearLayoutやRelativeLayoutとかですでに作成されたレイアウトファイルでスクロールしたいのなら
外側にもう一つレイアウトクラスをつくり挟むようにする

Androidで、最後まで表示したら自動で項目追加

Androidで、最後まで表示したら自動で項目追加

Twitterとかでよくみる、一番下までみると
次のリストを読み込むのを実装

これは、大量にあるデータをすべて読み込まずに
リストの最後尾が表示されたら
逐次読み込むリストを作る

これには、OnScrollListenerを使い
最後まで読み込まれたか判定して、データを追加することでできる

項目の自動追加はJavaで行う

まずは、implementで使えるようにするので

extends OnScrollListener

を追加する

あとは、onCreate()へ処理を追加

mlistView = (ListView)findViewById(R.id.list);

//読み込み中のフッター生成
mFooter = getLayoutInflater().inflate(R.layout.progres_item, null);

//ListViewにフッター設定
mlistView.addFooter(mFooter);

//スクロールリスナー設定
mlistView.setOnScrollListener(this);

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount){
//末尾の場合、次のアイテム読み込み
if(totalItemCount == firstVisibleItem + visibleItemCount){
additionalReading();
}
}

@Override
public void onScrollStateChanged(AbsListView arg0, int arg1){
}

private void additionalReading(){
//すでに読み込み済みならスキップ
if(mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING){
return;
}

/*通常はネットワークやファイルからデータが読み込まれるため非同期に読み込み処理を実装する

今回は、サンプルなので非同期処理はそのままで
データ読み込みを意図的に遅延処理にしている

mTask = new AsyncTask(this).execute(test);

}

最後までスクロールしたときの判定基準は
firstVisibleItemと
visibleItemCountを足した値が
totalItemCountになったときに
ListViewの最後に到達したと判断し
追加の呼び出し処理をしている