2013年12月31日火曜日

DialogFragmentから特定のActivityへのコールバックメソッド

アクティビティから生成したダイアログフラグメントで呼び出し元のアクティビティのメソッドを実行したい。値の受け渡しとかしなきゃいけないのかなーとか思っていたら案外簡単に出来ました。 呼び出し元のアクティビティをMainActivity,呼び出したいメソッドをcallback()とすると
MainActivity activity = (MainActivity)getActivity();
activity.callback();
//ダイアログフラグメントの消去
dismiss();
これだけ。getActivity()だと特定のクラスを指定しなきゃいけないじゃん、とか思ったけれどもキャストしてあげれば何の問題もありませんでした。これをフラグメントを解消する前に記述してあげればコールバック(のようなもの?)ができます。

2013年12月18日水曜日

URLスキーム設定

ブラウザのリンクからアプリを呼び出すURLスキーム,iOSでは簡単に実装できるそうですがAndroidでは地味にめんどくさかったです。二種類ほど方法を説明します。

1.アプリがインストールされている場合のURL設定
AndroidManufest.xmlのURLから起動したいアクティビティに以下のインテントフィルタを追記します。

<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="hogehoge" android:host="android" />
</intent-filter>

ブラウザから上記のように設定したアプリを開くときは,以下のようにHTMLタグを設定します。

<a href="hogehoge://android">テストリンク</a>
しかしこれはアプリが端末にインストールされている場合のみ有効なようです。インストールされていない場合はGooglePlayに飛ばすとかできるのが理想なんですけど、わからず。そこで,代替案が次の方法になります。

2.アプリのインストール有無にかかわらずGooglePlayへ飛ばす
タイトルそのまんまです。インストールされている場合はそこからアプリを開けるし,まだインストールしていない場合はダウンロードできる。これが僕が調べた中では都合が良さそう。
ブラウザのURLは以下のように設定します。スキームは上記のAndroidManifest.xmlと同様とします。
<a href="intent://scan/#Intent;scheme=hogehoge;package=アプリのパッケージ名;end">GooglePlayへのリンク</a>
これであればアプリをインストールしているかにかかわらずユーザを目的のアプリへ誘導できます。多少の難は残りますが。

2013年12月11日水曜日

EditTextのキーボードを表示する

EditTextのキーボードの表示させる方法について記述します。

以下のメソッドを利用すれば表示できるみたいです。
getWindow().setSoftInputMode(WindowManager.LayoutParams
.SOFT_INPUT_STATE_ALWAYS_VISIBLE);

ちなみにダイアログ・フラグメントダイアログなどではそのクラスのgetWindow()メソッドを使用してあげれば良いようで。(dialog.getWindow(・・・)という感じ)

2013年12月6日金曜日

TeraTerm,WinSCPによるSSH転送

WinSCPとTeraTermの二つそれぞれからサーバーをひとつ経由して目的のサーバーへ接続する方法を調べたので記載。

自分のPC→サーバーA→サーバーB というようにサーバーAを経由してBに接続する場合を考える。


1.WinSCPによるトンネルを利用した接続

最初に,新規のセッションを開きサーバーBのホスト名,ポート番号等を入力する

次に左の設定におけるトンネルの項目を選択。以下の画面が表示されるので経由するサーバーAの情報を入力する。



2.TeraTermの場合

TeraTermを起動すると「新しい接続」と出るがそこをキャンセルし,メニューの設定→SSH転送を選択する。
出てくるSSHポート転送の追加を選択すると次のような画面が現れるので,以下の値を設定する。
ローカルのポート:任意(使用されていないポートならなんでも良い)
リッスン:空白
リモート側ホスト:接続するサーバーBの情報
リモート側ポート:(Aを経由して)接続するサーバーBのポート


これでOKを押し設定画面をとじたあと,サーバーAに接続する。
サーバーAに接続したあと,そのウィンドウを開いた状態で新しくTeraTermを起動しlocalhostで接続する。その際ポート番号は上で指定したローカルのポート番号を使用する。
その後下のように通常のSSH認証画面が表示されるのでサーバーBのユーザー名・パスワードを入力してあげれば良い。




MySQLのデータ移行

MySQLのDB移行についてやり方のメモ

エクスポートのコマンド
mysqldump -u MySQLのユーザー名 -p データベース名 > databese.sql

パスワードが求められるのでデータベースのパスワードを入力すると現在いる場所にデータがエキスポートされる。

インポートする際はローカルに落として移行先のサーバに接続、コピー。空のデータベースを作成してインポートした

インポートのコマンド
mysql -u MySQLのユーザー名 -p 新データベース名 < database.sql


尚拡張子はsqlだろうがlogだろうが大丈夫らしい。データベース名も新旧で一致している必要はなかった。


Android ActionBarサポートライブラリ メニューについて

以前2.x系でActionBarをサポートライブラリを利用して実装したのだけれどその際にメニューがアクションバーに表示されなかった。

今日調べてみたら公開されてから日にちが経ったからか同じような人がいて無事実装できることに

/res/menu/以下にあるメニューファイルに関して,以前までは

xmlns:android="http://schemas.android.com/apk/res/android"

だった部分に

xmlns:app="http://schemas.android.com/apk/res-auto"

を追加。itemタグの各メニューでも
android:showAsAction="always"

であった部分を
app:showAsAction="always"

に変えたことでメニューが表示されるようになった。

参考:Android Support Library v7でActionBarにメニューボタンが表示されない件