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

layout_weightの動的変更はできないぽい・・・

制作中のアプリで縦画面時はListViewを一つ非表示にして縦に並べようとしたが、
layout_weightをJavaで動的変更すれば簡単と思ったが、layout_weightはViewGroup.addViewするときにしか設定できないようで、Viewを設置したまま後から変更することはできないらしい・・・

ListViewの高さ設定したりとかちょっと試したが、良い感じにはできなかったんで、
諦めて縦画面時もListView2つ表示して常に2分割するレイアウトにすることにした。


あとは画面開店時の状態復元と、サーバー登録とかで終わりにする。

数日中に完成しそう

制作中のFTPクライアントは、先日までにFTPでの機能を一通り終わらせて、今全機能をSFTPに対応させた。
というわけで、後はサーバー登録とかだが、前のテキストエディタのソースを完全流用できると思うんですぐ終わる予定。

SFTP対応は、JschのSFTP関連はパーミッション変更とか必要なメソッドが揃ってるんですぐできた。
これ作ってて知ったが、FTPにはchmod相当の機能って無いんだね。
FTPでのchmodはサーバーコマンドでchmodするみたいなんで、そうした。
Commons NetのFTPにサーバーコマンド送る機能があったんで難しくはない。

ListViewの動的更新処理中にタッチするとアプリが落ちる

制作中のアプリでステータス表示の処理を作ったが、
「ListViewの動的更新処理中にタッチするとアプリが落ちる。」
という現象に遭遇した。

ステータスはListViewに表示で、連続して大量にListViewを更新する。
のだが、logcatになにも表示されないでアプリが落ちる現象が発生した。

logcatになにも表示されないので、Timer使った部分かAsyncTaskLoaderの非同期部分が原因かと思ったが、
何度か再現していると、ステータス更新処理中にスクロールしようとしてListViewを触ると100%落ちることが判明。


回避方法は、今回の場合はListViewはスクロールできなくて良いので、
View.setEnabled(false)
か、
View.setOnTouchListener()
でListViewを触った時に何もしないようにすればいいみたい。
スクロールが必要な場合は面倒だね。
setEnabledの方はタッチ以外に影響あるかもなんで、setOnTouchListenerの方で対処した。


テストはAndroid 4.2のエミュレーターで。

ListViewを縦に並べる

制作中のアプリでちょっとハマったんだが、
ファイル一覧等をLinearLayoutで縦に並べて、ステータス表示も同じLinearLayout中に置こうとした。
ステータス表示はListViewで複数行表示できるようにしてLinearLayout中に必要な高さだけ確保してもらえると思ったのだが、
ListViewの高さが更新されないのか、ステータス領域が表示されなかった。

全体のレイアウトはmain.xmlで、ステータス表示用ListViewの行レイアウトはstatus.xml。
status.xmlはLinearLayoutでListViewの行を包む感じだが、ここでandroid:layout_heightを絶対値で指定しないとListViewの高さが確保できないみたい。
status.xmlのLinearLayoutにandroid:layout_heightを絶対値で指定すると、ListViewを更新すれば必要な高さだけ確保されて表示される。


引き続きFTPクライアントを制作中

引き続きFTPクライアントを制作中。


今日はリモート側のファイルをドラッグ&ドロップしてGETする処理作った。
前のテキストエディタの時はファイルのGETしかなかったが、ディレクトリのGETもあるから再帰的にやらんとだね。
ステータスの表示もする予定なんで、1個ずつGETする感じで、
タスクの追加も可能にするつもりなんで、AsyncTaskLoaderはrestartLoader()じゃなくて、IDを確認してinitloader()するようにした。
LoaderManager lm=getLoaderManager();
  for(int i=0;true;i++){
    if(lm.getLoader(i)==null){
      lm.initLoader(i,req,this);
      break;
  }
}
こんな感じで、0番から確認してgetLoader()がnullならそのIDを使うように。

ローカル側のファイル削除処理も既に作ってあったが、
File.delete()でディレクトリの場合は空じゃないと削除できないようなんで、これも再帰的にやる必要があった。


機能自体は、あとローカル側からリモート側へのアップロードと、パーミッション変更作れば終わりだが、ステータス表示がめんどそう。
まあ、来週前半には完成させたい。

パーミッションはローカルとリモートで同期させたかったが、
APIの標準機能だとアプリ権限のrwxしか取得できないようなんで完全な同期ができない。
アプリ権限以外のrwxを取るのも不可能ではないと思うが、アプリ権限はユーザー権限ではないからパーミッション同期は捨てた方が良さそう。