android:初回起動時のみ実行したい時の処理

kishidaです。

先月ぐらいに同窓会の参加申し込みハガキが届きました。参加の意思はあるのでそのうち返事を出そうと思いながらズルズル今まで引っ張っています。今月末が締め切りなので急がねば。

アプリを作っていると初めて起動した時だけ、あるいは一度だけ処理を実行したいということがあります。
そんな時に便利なのがPreferenceです。

  SharedPreferences pre = getSharedPreferences(MODE_PRIVATE);
  if(pre.getBoolean("fast_start", false)){
    /***処理***/
    Editor e = pre.edit();
    e.putBoolean("fast_start", true);
    e.commit();
  }

初めて起動したときはPreferenceには何も設定されていないので条件にPreferenceを使用し処理を実行した後に記録してやれば一度だけ実行することができます。

カテゴリー: Android

Activity切り替えで暗転する

どうもkishidaです。

Activityが切り替わるタイミングでたまに一瞬暗転してActivityが切り替わらない、ということが起こるようになりました。

なんなんだろうと思ってlogcatを見るとoutofmemoryの表示があります。

ちょうどActivityに画像を表示する処理の後だったので、試しに画像のサイズを落としたら暗転しなくなりました。

そういえばメモリが足りなくなると勝手にActivityを終了したりするらしいので、
これがそうなのかーと思いました、

これからはそういった部分にも気を配ります。

カテゴリー: Android

画像を重ねる

kishidaです。

画像を重ねて表示しようとした時に迷ったので書きます。

画像を重ねて表示する方法はいくつかあるようですが個人的にはFrameLayoutを使うのがよさそうです。

FrameLayoutの中にLinearLayoutを作ってその中にImageViewを置けば描画位置も調整出来ます。
(下記ではmarginで調整してます)



 

  

    

  

カテゴリー: Android

Viewの表示、非表示

kishidaです。

今回はViewの表示と非表示の切り替えについてです。
表示の切替はsetVisibility()を使用します。

view#setVisibility(int visibility)

visibilityに以下の定数を指定することで状態を切り替えます。

View.VISIBLE 表示
 デフォルトの値です。

View.INVISIBLE 非表示
 Viewを非表示にして非表示になった空間は残ります。

View.GONE 非表示
 Viewを非表示にして非表示になった空間は詰めます。

覚えておいたら色々役立ちそうです。

カテゴリー: Android

WebViewでのinput type fileの取り扱い

kishidaです。タイトルの通りのことでハマったので書きます。
原因は簡単にいえばandroid側のデフォルトではでinput type file に対応していないので対応させてやる必要があるみたいです。

private final static int FILECHOOSER_RESULTCODE = 1;
private ValueCallback mUploadMessage;
private WebView webView = new WebView(this);

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
  mWebView = new WebView(this);
  mWebView.setWebChromeClient(new WebChromeClient() {
    //androidOS 4.1
    public void openFileChooser(ValueCallback uploadMsg, String acceptType, String capture) {
      mUploadMessage = uploadMsg;
      Intent i = new Intent(Intent.ACTION_GET_CONTENT);
      i.addCategory(Intent.CATEGORY_OPENABLE);
      i.setType("image/*");
      startActivityForResult( Intent.createChooser(i, "title"), FILECHOOSER_RESULTCODE);
    }
    //androidOS 3.0 以上
    public void openFileChooser( ValueCallback uploadMsg, String acceptType){
      openFileChooser( uploadMsg, acceptType , "");
    }
    //androidOS 3.0未満
    public void openFileChooser(ValueCallback uploadMsg) {
      openFileChooser(uploadMsg, "", "");
    }
  });
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
  if (requestCode == FILECHOOSER_RESULTCODE) {
    if (null == mUploadMessage) return;
      Uri result = (intent == null || resultCode != RESULT_OK)  ? null : intent.getData();
      mUploadMessage.onReceiveValue(result);
      mUploadMessage = null;
  }
}

以上を加えてやればOK。
aleatなども処理を書いてやらないといけないみたいなのでなかなか大変です。

カテゴリー: Android

Activityの切り替えについてちょっとした気付き

どうも、kishidaです。最近時間が過ぎるが早く感じて来ました。
ふと時計を見たらあれ、もうこんな時間。月日を意識するともう◯ヶ月たったのか。
と感じることが多くて勿体なく感じます。

何か趣味でも探すかー

あと、Activityを切り替えるときに気がついたのですが、
例えば下記のソースが合ったとして

Intent i = new Intent(getApplicationContext, HogeActivity.class);
startActivity(i);
Log.d("ここも", "動く");

こういうActivityを切り替えるときにStartActivity()の後に処理を記述してもきちんと後ろの方まで動作するんですね。
今まで動作しないか中断する感じなのかなーと思っていたのでちょっとした気づきでした。

カテゴリー: Android

android : backキー(戻るボタン)が動かない

kishidaです。別Activityから使用したwebviewで戻るボタンを扱った際にハマりました。

いろんなサイトを参考しながら始めに書いたソースがこんな感じです。

public class MainActivity extends Activity {
  private WebView webview;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    /*****省略*****/
  }

  @Override
  public boolean onKeyDown( int keyCode, KeyEvent event ) {
    if ( event.getAction() == KeyEvent.ACTION_DOWN
&& keyCode == KeyEvent.KEYCODE_BACK && webview.canGoBack() == true){
      webview.goBack();
      return true;
    }
    return super.onKeyDown( keyCode, event );
  }
}

実行してみると一つ問題が。
Activity_A -> Activity_B(webview起動)、ページ1表示 -> ページ2 -> ページ3
ここまで実行した後backキーを押していくと、ページ2までしか戻らずそれ以上押しても何も起こりませんでした。

どうも2番めに起動したページまでしか戻らないみたいです。

で、いろいろ試してとりあえずは動かせるようになりました。

public class MainActivity extends Activity {
  private WebView webview;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    /*****省略*****/
    _webview();
  }

//WebViewの設定、読み込み
  public void _webview(){
    /*****省略*****/
  }
  @Override
  public boolean onKeyDown( int keyCode, KeyEvent event ) {
    if ( event.getAction() == KeyEvent.ACTION_DOWN
&& keyCode == KeyEvent.KEYCODE_BACK){
      if(webview.canGoBack() == true ) {
        if(webview.copyBackForwardList().getCurrentIndex() == 1){
          _webview();
          return true;
        }
      webview.goBack();
      return true;
    }else{
    }
  }
  return super.onKeyDown( keyCode, event );
}

webview.copyBackForwardList().getCurrentIndex() で現在のページを調べて2番めのページならwevviewを再起動する感じにしました。

正直無駄が多いとは思うんですがいい方法が見つかるまでは我慢。

カテゴリー: Android

続・画面の切替(FuelPHP)

kishidaです。
以前FuelPHPの画面の切替について書きましたがもっといい方法がありました。

Viewオブジェクトの変数に対してViewオブジェクトを割り当てることで作りがかなりコンパクトになります。


Hoge/hoge



  
    
  
  
    

Hoge/head


<? echo $title; ?>

php

$view = View::forge('Hoge/hoge');
$view->head   = View::forge('Hoge/head');
$view->header = View::forge('Hoge/header');
$view->content= View::forge('Hoge/content');
$view->footer = View::forge('Hoge/footer');

※ header、content、footerは省略

Hoge/headの$titleに値を指定する際はView::forge()の引数にしなくても

$view->set_global('title', 'タイトル');

と記述してやれば値を割り振れます。

カテゴリー: php

Intentについて

kishidaです。以前Intentについて少し書きましたが今回はもう少し詳しく書こうと思います。

明示的と暗黙的の違い
Intentには明示的なIntentと暗黙的なintentがあり、
明示的なIntentはアクセスするActivityを指定し、暗黙的なIntentはシステムに命令を出して、システム側から、受け取った情報を元にアクティビティ決定します。
つまり明示的なIntentは送り先を明示的に指定し、暗黙的なintentは送り先を明示的に指定しません。

前に取り扱ったのは明示的なIntentなので、今回は暗黙的なインテントについて

//コンストラクタ
Intent(String action)
Intent(String action, Uri uri)

主にこの2つのどちらかを利用します。
actionには定数(Intent.ACTION_VIEW 等)を指定、urlには目的に応じたパラメータを指定します。(URLや電話番号 等)

Intentのインスタンスを生成したらstartActivity(Inten intent)を呼び出してやれば実行されます。

カテゴリー: Android

画面の切替(FuelPHP)

どうも。kishidaです。
fuelphpを使いました。使った感じだと少し癖がありますが慣れたらかなり使いやすそうに感じました。

その中で画面の切替などに手間取ったのでそれを書きます。

まず切り替えに便利そうなのがこんな記述の処理です。

$data=array(
'hoge'=>1
);
return View::forge('Hoge/hoge',$data);

View::forgeでviewオブジェクトを生成し、それを出力する。

第一引数はviewの場所を指定(viewsディレクトリからの相対位置)。第2引数生成したテンプレートで扱いたい値を渡しています。(指定しなくてもOK)

連想配列を指定してやることで、テンプレート側でキー名を変数として扱えるようになります。

例(1が出力されます)


値を渡す方法は他にもありますが個人的にはこれが一番扱いやすいかな~と思っています。

ただ上記の方法だとテンプレートを直接生成しているので、例えば

public function action_index(){
  //処理(1)
  return View::forge('Hoge/index',$data);
}

public function action_hoge(){
  //処理(2)
  return View::forge('Hoge/index',$data);
}

これでaction_hogeの方を実行してやると処理(2)は実行されますが処理(1)は実行されません。

処理(1)も実行したい場合はredirect()でアクセスしてやります。

public function action_hoge(){
  //処理(2)
  Response::redirect('Hoge/index')
}

※redirect()で値を渡すことはできないのでaction_hogeのデータをaction_index()使用したい場合はセッションを利用する。

冷静に考えたら上記の例で言えば
リクエストの呼び出し → 処理 → テンプレート生成
となっているのだから別のメソッドが動かなくて当たり前なんですよね。

私はいったい何を考えてたのやら。

カテゴリー: php