Androidのアプリ開発関連のブログ

AsyncTaskLoaderで状態維持

制作中のテキストエディターで、初回load時にFTP接続して2回目以降は以前の接続状態から通信。
って処理がしたくて、loadInBackground()中でクラス変数に状態を保存してたんだが、

サブスレッドで変数記録しても、メインスレッドと別物じゃね?
って気がしたんで確認してみたが、案の定、記録できてなかった。

この件で今日はかなりハマったんだが、
慣れたPerl感覚だと別スレッドなら変数は全部別物と思ったが、Javaの場合はstaticな変数はスレッド間で共通みたい。
状態記憶用の変数をstaticにするだけでloadInBackground()中で設定した値が維持できた。

ただ、スレッド間で同じメモリ領域扱ってるってことだよね?
そうだとすると、複数スレッドで同時に触っちゃうと壊れね?
って思ったんだが、
synchronized(this){
   同期処理;
}
って感じで、synchronized使うとスレッド間でロック取って排他処理ができるみたい。

Android APIの方で調べてて全然わからなくてハマったが、Javaレベルでこんなことができるんだね。
知ってれば簡単だねー

アプリアイコンにメニュー

制作中のテキストエディターで、アプリアイコン(アプリタイトル)部分をクリックするとプルダウンメニューを出してタブUIのエディタの様に複数ファイルを切り替えられるようにしようとしていたが、
アプリアイコン部分をメニューにする方法がちょっとわかりにくかった。

まず、onCreateで、
getActionBar().setHomeButtonEnabled(true);
を設定しないとAndroidのバージョンによってはアプリアイコン部分がボタンにならない。
これは前のブログエディターでも使ってたからわかってた。

アプリアイコン部分がボタンになると、onMenuItemSelectedでタッチ時の処理ができ、
その場合はアプリアイコン部分のMenuItem.getItemId()はandroid.R.id.homeになる。
    public boolean onMenuItemSelected(int featureId,MenuItem item){
        if(item.getItemId()==android.R.id.home){
           処理
            return true;
        }
        return false;
    }
こんな感じでアプリアイコン部分がタッチされた時の処理が書けるわけだが、


    public boolean onMenuItemSelected(int featureId,MenuItem item){
        if(item.getItemId()==android.R.id.home){
            PopupMenu popup=new PopupMenu(this,findViewById(android.R.id.home));
            popup.getMenu().add("test");
            popup.show();
            return true;
        }
        return false;
    }
android.widget.PopupMenuを使うとプルダウンメニューが出せる。

android.widget.PopupMenuの使い方は、
android.widget.PopupMenu(Context context,View anchor);
で、2番目の引数でViewを渡すが、
popup.show();
した時に、設定したViewの直下にメニューが表示される。
メニューに対してサブメニューを作る感じではなくて、なんでもいいからViewに対して設定して、ポップアップする際の位置が設定したViewの位置になる感じ。
popup.getMenu()
でMenuが取得できるんで、普通にadd()で項目の追加ができる。

メニューは事前に作るものだと思ってたからちょっとわかりにくかったんだが、
ボタンタッチ等のアクション時にメニューを作成して、そのViewに対してshow()で即表示させられて便利だね。


PopupMenuで目的通りのことができそう。

今日は、予定してたファイル読み込み処理の分離をやって、
編集ファイルの切り替えができる仕様だと複数ファイルを読み込んで状態維持しなきゃいけないことに気づいたんで、複数ファイルを記録して管理できるようにした。
あとは上記のPopupMenuで切り替えられるようにして、保存できるように。

当初考えていたよりだいぶ時間かかっちゃってるが、今週中にはテキストエディタとして最低限の機能は持った状態になるかな。
保存機能がまだないからなw