TAKETOMA's Labo

作成しているAndroidアプリのサポートと
プログラミングやいろんなガジェットについて
備忘録を残していくブログです

ラベル 開発Tips の投稿を表示しています。 すべての投稿を表示
ラベル 開発Tips の投稿を表示しています。 すべての投稿を表示

Android Activityの背景を透明にする

Activityの背景を透明にするには
テーマとして設定すれば簡単にできる。

res/values/styles.xmlで以下のように記述


    
        true
        
        true
    
--> これをマニフェストファイルのapplicationなりactivityなりに適用すれば、 背景が透明でタイトルバー(アクションバー)が出ないアクティビティができる

~


or


~


当然ながらapplicationは、アプリケーション全体に適用。
activityは指定したアクティビティに適用される。

Easy Sujiはこの透過背景に背景色をつけて
暗くて後ろが透過しているアクティビティを実現している。


使いどころはアイデア次第かと思われるが
面白半分に使いまくるとわけのわからん画面になること間違いなし。


Easy Sujiは何か文章を記述中に呼び出されるので
前後の文字が何か見えた方が使い勝手がよいかなという理由で透過にしています。

Android アプリ内に画像を保存する

Androidで画像を保存する方法としては以下の3パターンがあるかと思う

1)アプリ内に保存
2)SDカード内に保存
3)データベースに保存

自分のアプリでも1)が一番よく使っている。
SLAMDUNKLineの背景やTextIconCreaterIconPackでアイコンを保存しているのは
アプリ内保存です。

Handromemoは2)の方法でSDカードに保存している。

3)は試したことないけれどバイナリで保存できるはず、、、きっと。


1)の方法で画像を保存する方法はこんな感じで簡単。

FileOutputStream out = null;
try {
    // openFileOutputはContextのメソッドなのでActivity内ならばthisでOK
    out = this.openFileOutput("image.png", Context.MODE_PRIVATE);
    image.compress(Bitmap.CompressFormat.PNG, 100, out);
} catch (FileNotFoundException e) {
    // エラー処理
} finally {
    if (out != null) {
        out.close();
        out = null;
    }
}

保存した画像の読み込みも簡単
InputStream input = null;
try {
    input = this.openFileInput("image.png");
} catch (FileNotFoundException e) {
    // エラー処理
}   
Bitmap image = BitmapFactory.decodeStream(input);

保存した画像の削除
this.deleteFile("image.png");
この方法ならば、画像ファイルだけでなく 各ファイルなんでも保存できるので便利だし、 SDカード使用する際の権限等も不要。

AndroidのレイアウトXMLファイルを分割する

Activityなどのレイアウトを定義しているXMLファイルは分割することが可能。 

同じレイアウトを使いまわしたいときに便利。

使い方はいたって簡単。

使いまわしたいレイアウトファイルがsub_layout.xmlだとすると

以下のようにincludeの一行を入れたい部分に挿入するだけ。


    
    

これで簡単にレイアウトファイルの使い回しが可能になります。

AndroidOSのバージョンを判定する

Androidは、3.Xのタブレット用HoneyCombから2.Xのスマートフォン用に比べて
APIが大きく増えている。

2.X系のスマートフォンでは使えないけれど
3.X系のタブレットでは使用したいAPIがあれば、
AndroidOSのバージョンを判定する必要がある。

AndroidOSのバージョンは

Build.VERSION.SDK_INT

で判断できる。

SDKのAPIレベルが返ってくるのでそれで判断する

    if(Build.VERSION.SDK_INT > 10){
        // HoneyComb以降
    }else{
        // GingerBread以前
    }

インテントで他のアプリと連携する

インテントとはAndroid OSでアプリ間やアプリとシステム間の橋渡しをする
素晴らしい機能です。

自分のアプリでできないことは他の機能を持つアプリにしてもらえばいい
というエコな機能です。

そんなインテントで他のアプリと連携する方法をまとめておく。

・テキストを他のアプリに送るインテント
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_SEND);
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_TEXT, "テキスト");
    startActivity(intent);

・ブラウザを起動するインテント
    Uri uri = Uri.parse("https://www.google.com"); 
    Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
    startActivity(intent);

・画像を取得するインテント
    Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
    intent.setType("image/*"); 
    startActivityForResult(intent, 0);

・マーケット(現Playストア)を検索するインテント
    Uri uri = Uri.parse("market://search?q=" + "検索キーワード"); 
    Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
    startActivity(intent);

・YouTubeアプリで検索するインテント
    Intent intent = new Intent(Intent.ACTION_SEARCH);
    intent.setPackage("com.google.android.youtube");
    intent.putExtra("query", "検索キーワード");
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);

・EverNoteアプリで検索するインテント
    Intent intent = new Intent();
    intent.setAction("com.evernote.action.SEARCH_NOTES");
    intent.putExtra(SearchManager.QUERY, "検索キーワード");
    startActivity(intent);

・明示的にアプリを呼び出すインテント
    Intent intent = new Intent();
    // パッケージ名とアクティビティ名を明示してインテントを呼び出す
    intent.setClassName("パッケージ名", "アクティビティ名");
    try{
  startActivity(intent);
    }catch (ActivityNotFoundException e){
 // 明示的に指定したアプリが見つからない場合、Playストアへ直行する
 Uri uri = Uri.parse("market://details?id=" + "パッケージ名"); 
        Intent it = new Intent(Intent.ACTION_VIEW, uri); 
        startActivity(it); 
    }

AndroidのTextViewをカスタムする

そろそろスマートフォンにもAndroid4.0が普及してきそうだ。 
Android4.0へのアップデート情報や4.0搭載の新機種の話題がたくさん。

タブレットは普及しているのかは不明だが(我が家にはTF101がある)、
GoogleのNexusタブレットはかなり低価格で販売されそうだとの噂もちらほら。

アプリもいろいろとついていかないといけないなぁと思い
最近はもっぱらAndroid Developer's のReferenceを読みふけっている。

Android3.0以降から使えるようになったAPIはたくさんあるので
勉強してアプリに組み込んでいきたい。

今日はTextViewについてメモっとく。 

TextViewは、Android3.0以降から長押しでテキスト選択可能になっている。
テキスト選択するには

TextView#setTextIsSelectable(true)

で選択可能にしてあげると選択モードに切り替わる。 

選択モードになると
すべて選択とコピーがアクションバーに表示されるのだが、
これだけだと微妙に使い勝手が悪い。 

で、選択モードをカスタムできちゃうのがこのメソッド

TextView#setCustomSelectionActionModeCallback()


使用方法はこんな感じ こんなコールバックインターフェースを実装する。

 private class TextSelectActionMode implements ActionMode.Callback {
     
     @Override
     public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
      if ("custom".equals(item.getTitle())){
       // テキストに対してなんらかの処理をする
       // 例えば、選択した文字列を()でくくるとか
      }
         return false;
     }

     @Override
     public boolean onCreateActionMode(ActionMode mode, Menu menu) {
      // アクションアイテムを作る
      MenuItem cutItem = menu.add("custom");
      cutItem.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
      cutItem.setIcon(R.drawable.icon);
      
         return true;
     }

     @Override
     public void onDestroyActionMode(ActionMode mode) {
     
     }
     @Override
     public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
         return false;
     }
 }
そして、以下のようにTextViewにセットするだけでカスタムしたテキストビューができる。
TextView.setCustomSelectionActionModeCallback(new TextSelectActionMode());

Androidアプリからメールを送る方法

EasySujiの変換候補追加の要望を
Androidマーケットのコメントに書かれることが多かった。

メールの方が事細かにやり取りできると考え、
少し前のバージョンから要望メールを送れるようにした。

その時のTipsが以下
 /**
  * メールを送信
  */
 private void sendMail(){  
        Intent intent = new Intent();  
        intent.setAction(Intent.ACTION_SENDTO);  
        intent.setData(Uri.parse("mailto:" + "hogehoge@gmail.com"));  
        intent.putExtra(Intent.EXTRA_SUBJECT, "件名");
        intent.putExtra(Intent.EXTRA_TEXT, "メールの内容");
        startActivity(intent);  
    }



メールが送れるようになったのはいいんだけれども、
よく本文に何も記載されていないメールが届くようになった。。。

メールが送れるようになったといっても、
インテントでメーラーが起動されるにすぎないので
そのまま送信ボタンを押しちゃうというのは
なにか私の思いがうまく伝わっていないのかな?

配置場所?
説明が足りない?

使用方法がわからないといったコメントもあったので、わかりづらいのかな?

わかりやすい、使いやすいを実現するのはなかなか簡単ではないですね