Androidアプリケーションの開発を勉強中。
No.14
2012/03/13 (Tue) 15:07:15
ViewFlipperの自動スクロールが、ある特定の状況で動かない件についてメモ。
ある特定の状況とは、端末を操作せずに放置して、画面が暗くなってからすぐに復帰させた場合。およそ10秒以内。
ロック解除の画面が表示されず、画面消灯前の画面がすぐに表示されますよね。
あの時です。
そうすると、ViewFlipperの自動スクロールが動かなくなるんですよ。
onResumeでstartFlippingしてるにも関わらず。
onResumeはきちんと通過してるんですが。
画面タップやらボタンクリックやらでもstartFlippingするようにしていますが、それも動かない。
ですが、放置→画面消灯後に、ロック解除画面を経て復帰させた場合は動くんですよ。
あと、この症状が発生しても、ロック解除画面を経て復帰させれば直るんですよ。
目下調査中。
ある特定の状況とは、端末を操作せずに放置して、画面が暗くなってからすぐに復帰させた場合。およそ10秒以内。
ロック解除の画面が表示されず、画面消灯前の画面がすぐに表示されますよね。
あの時です。
そうすると、ViewFlipperの自動スクロールが動かなくなるんですよ。
onResumeでstartFlippingしてるにも関わらず。
onResumeはきちんと通過してるんですが。
画面タップやらボタンクリックやらでもstartFlippingするようにしていますが、それも動かない。
ですが、放置→画面消灯後に、ロック解除画面を経て復帰させた場合は動くんですよ。
あと、この症状が発生しても、ロック解除画面を経て復帰させれば直るんですよ。
目下調査中。
PR
No.12
2011/06/08 (Wed) 02:28:33
以前どうやればいいんだーってなってたのが解決したので。
画面の高さ-キーボードの高さとか言ってたけどそんなことしなくてもよかった。
色々調べてたら、AndroidManifest.xmlの方に記述する「adjustPan」と「adjustResize」というものを発見。
Y.A.Mの雑記帳 Android Onscreen Input Methods
こちらに詳しく書いてあります。
こちらのブログにはほんとお世話になります……。
なんとなく私がやりたいことはadjustPanっぽいなあ。
……でもここにあるadjustResizeの2つ目の例の方がそれっぽいような気も……?
とりあえず、上のブログにあるサンプルを動かしてみた。
するとadujustPanは期待した動きをしてくれない。
うーん?
そしてadjustResizeの方はブログに書いてある通りに動く。
うーん。しかし私がやりたいことはそういう動きではないんですよね……。
色々悩んでいましたがはっと気づきました。
ここのサンプルでandroid:layout_weight="1"を設定したテキストボックスが、adjustResizeでサイズが変わっている……。
ということは、全体をスクロールビューに入れて、スクロールビューにandroid:layout_weight="1"を設定したらどうだろう。
これが正解でした。
ではサンプル。
そしてAndroidManifest.xmlのアクティビティタグの中に、
android:windowSoftInputMode="adjustResize"
をいれます。
するとこんな感じになります


キーボードが出てくるとスクロールビューのサイズが変わって、全体がスクロールするようになりました。
下部にあるボタンを常に表示させたい場合は、スクロールビューの中からボタンを出して、全体をさらにLinearLayoutでくくってあげればOKです。
こんな感じになります。


このサンプルのように、キーボードが出ていない時にスクロールビュー外にあるUIをスクロールビューのすぐ下に配置したい場合は、全体をくくっているLainearLayoutのandroid:layout_heightをwrap_contentにすればできます。
スクロールビュー外のUIを画面の1番下にもっていきたい場合はfill_parentにすればいいわけですね。
……なんだかうまく説明できていないような気もする。
ちなみに、スクロールビュー内のUIにandroid:layout_weightを使っても、残り余白いっぱいに広がってくれませんでした。
なので上の方法で、かつ中のUIにlayout_weightを使いたい場合どうすればいいのかはわかりません……。
画面の高さ-キーボードの高さとか言ってたけどそんなことしなくてもよかった。
色々調べてたら、AndroidManifest.xmlの方に記述する「adjustPan」と「adjustResize」というものを発見。
Y.A.Mの雑記帳 Android Onscreen Input Methods
こちらに詳しく書いてあります。
こちらのブログにはほんとお世話になります……。
なんとなく私がやりたいことはadjustPanっぽいなあ。
……でもここにあるadjustResizeの2つ目の例の方がそれっぽいような気も……?
とりあえず、上のブログにあるサンプルを動かしてみた。
するとadujustPanは期待した動きをしてくれない。
うーん?
そしてadjustResizeの方はブログに書いてある通りに動く。
うーん。しかし私がやりたいことはそういう動きではないんですよね……。
色々悩んでいましたがはっと気づきました。
ここのサンプルでandroid:layout_weight="1"を設定したテキストボックスが、adjustResizeでサイズが変わっている……。
ということは、全体をスクロールビューに入れて、スクロールビューにandroid:layout_weight="1"を設定したらどうだろう。
これが正解でした。
ではサンプル。
<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="100dip"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="200dip"
/>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="OK"
/>
</LinearLayout>
</ScrollView>
そしてAndroidManifest.xmlのアクティビティタグの中に、
android:windowSoftInputMode="adjustResize"
をいれます。
するとこんな感じになります
キーボードが出てくるとスクロールビューのサイズが変わって、全体がスクロールするようになりました。
下部にあるボタンを常に表示させたい場合は、スクロールビューの中からボタンを出して、全体をさらにLinearLayoutでくくってあげればOKです。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="100dip"
/>
<EditText
android:layout_width="fill_parent"
android:layout_height="200dip"
/>
</LinearLayout>
</ScrollView>
<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="OK"
/>
</LinearLayout>
こんな感じになります。
このサンプルのように、キーボードが出ていない時にスクロールビュー外にあるUIをスクロールビューのすぐ下に配置したい場合は、全体をくくっているLainearLayoutのandroid:layout_heightをwrap_contentにすればできます。
スクロールビュー外のUIを画面の1番下にもっていきたい場合はfill_parentにすればいいわけですね。
……なんだかうまく説明できていないような気もする。
ちなみに、スクロールビュー内のUIにandroid:layout_weightを使っても、残り余白いっぱいに広がってくれませんでした。
なので上の方法で、かつ中のUIにlayout_weightを使いたい場合どうすればいいのかはわかりません……。
No.11
2011/05/29 (Sun) 00:41:44
ソース晒しつつ、今回の成果でも。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView
android:id="@+id/text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20sp"
/>
<Button
android:id="@+id/button1"
android:layout_width="150dip"
android:layout_height="wrap_content"
android:onClick="mixiAuthentic"
android:text="mixi認証"
/>
<Button
android:id="@+id/button2"
android:layout_width="150dip"
android:layout_height="wrap_content"
android:onClick="AuthDestroy"
android:text="認証解除"
/>
</LinearLayout>
package net.edo.hrio.mixiclient;
import jp.mixi.android.sdk.*;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.*;
public class mixiClient extends Activity {
private MixiContainer container;
private int AUTHORIZE_REQUEST_CODE;
private TextView text;
private Button button1;
private Button button2;
private boolean Auth;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
text = (TextView)findViewById(R.id.text1);
button1 = (Button)findViewById(R.id.button1);
button2 = (Button)findViewById(R.id.button2);
Config config = new Config();
config.clientId = "APIキー";
config.selector = Config.GRAPH_API;
container = MixiContainerFactory.getContainer(config);
//container.init(this); //ここ!
/*Auth = container.isAuthorized();
*/
Auth = false;
ButtonClickSet(Auth);
}
public void mixiAuthentic(View view){
container.authorize(mixiClient.this, new String[]{"r_profile", "w_voice"}, AUTHORIZE_REQUEST_CODE,
new CallbackListener(){
@Override
public void onComplete(Bundle values) {
// 正常時の処理
Toast.makeText(getBaseContext(), "認証しました", Toast.LENGTH_LONG).show();
Auth = true;
ButtonClickSet(Auth);
}
@Override
public void onCancel() {
// ユーザキャンセル時の処理
Toast.makeText(getBaseContext(), "キャンセルしました", Toast.LENGTH_LONG).show();
}
@Override
public void onFatal(ErrorInfo e) {
// 異常終了時の処理
Toast.makeText(getBaseContext(), "異常終了しました", Toast.LENGTH_LONG).show();
}
@Override
public void onError(ErrorInfo e) {
// エラー
Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
}
);
}
public void AuthDestroy(View view){
container.logout(this, AUTHORIZE_REQUEST_CODE,
new CallbackListener(){
@Override
public void onComplete(Bundle values) {
Toast.makeText(getBaseContext(), "認証解除しました", Toast.LENGTH_LONG).show();
Auth = false;
ButtonClickSet(Auth);
}
@Override
public void onCancel() {
// ユーザキャンセル時の処理
Toast.makeText(getBaseContext(), "キャンセルしました", Toast.LENGTH_LONG).show();
}
@Override
public void onFatal(ErrorInfo e) {
// 異常終了時の処理
Toast.makeText(getBaseContext(), "異常終了しました", Toast.LENGTH_LONG).show();
}
@Override
public void onError(ErrorInfo e) {
// エラー
Toast.makeText(getBaseContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
});
}
public void ButtonClickSet(boolean a){
if(a){
text.setText("認証済みです");
button1.setClickable(false);
button2.setClickable(true);
}else{
text.setText("未認証です");
button1.setClickable(true);
button2.setClickable(false);
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data){
super.onActivityResult(requestCode, resultCode, data);
container.authorizeCallback(requestCode, resultCode, data);
}
@Override
public void onDestroy(){
container.close(this);
super.onDestroy();
}
}
xmlファイルとjavaのソース自体はこんな感じになってます。
そしてjavaのソースの中で「ここ!」とコメント入れているところ。
どうもこの行があると、「エラーが発生しました云々」が表示されるようです。なので今現在はコメントアウトしております。
ちなみにこの状態でボタンを押してやると「異常終了しました」が表示されます。まあそうだろうなあ。
ちなみにmixi Developer Centerには
「SDKを利用するには、MixiContainerインスタンスの init メソッドをコールします。」
としか書いてないんだぜ。
なんだろ。何がだめなのかなあ。
No.9
2011/05/28 (Sat) 02:51:58
というわけで、今回から手探りでmixiのクライエントらしきものを作っていきたいと思います。
まずは先日公開されたばかりっぽい、mixi API SDK for Androidをダウンロード。
mixi Developer Centerの説明が結構丁寧なので、滞りなくインポートまでできました。
でもインポートされたファイル、エラーがある。
見てみるとコメント部分が文字化けしてた。
インストールしたファイルをIEで開いてみてエンコード方式を調べてみると、UTF-8っぽい。
ので、eclipseの文字コードを変える方法を調べて、ソースファイルをUTF-8で開くようにしてみました。
直った。そしてエラーも消えた。
そしてDeveloper Centerにある実装方法に従い、まずは認証を行うようにしてみました。
さて結果は。
なんかうまくいかなかった。
デバッグしてみると、onCreate内が終わったあたりで「エラーが発生しました云々」というトーストが表示されて、それでもボタンをクリックしてみたりすると強制終了という感じ。
強制終了されるときにデバッグ画面を見ると、Debugタブの中がView$1.onClick(View)というのが選択されてて、その下のソース部分にいつの間にやら「View.class」というタブが出現しており、その中で「Source not found」と言われている。
……これはつまりええと。View.classが見つからないよってことなの?
詳しく調べるのはまた今度にします。
今回せっかくなのでソースを貼り付けてみようと思い、どうせならあのソースをきれいに貼ってるやつを使ってみたい!と思ったので、SyntacHighlighterを使ってみようと思ったのですが、うまく表示されませんでした。 で、結局ソース貼り付けず。 こちらもまた今度時間があるときに挑戦します。
まずは先日公開されたばかりっぽい、mixi API SDK for Androidをダウンロード。
mixi Developer Centerの説明が結構丁寧なので、滞りなくインポートまでできました。
でもインポートされたファイル、エラーがある。
見てみるとコメント部分が文字化けしてた。
インストールしたファイルをIEで開いてみてエンコード方式を調べてみると、UTF-8っぽい。
ので、eclipseの文字コードを変える方法を調べて、ソースファイルをUTF-8で開くようにしてみました。
直った。そしてエラーも消えた。
そしてDeveloper Centerにある実装方法に従い、まずは認証を行うようにしてみました。
さて結果は。
なんかうまくいかなかった。
デバッグしてみると、onCreate内が終わったあたりで「エラーが発生しました云々」というトーストが表示されて、それでもボタンをクリックしてみたりすると強制終了という感じ。
強制終了されるときにデバッグ画面を見ると、Debugタブの中がView$1.onClick(View)というのが選択されてて、その下のソース部分にいつの間にやら「View.class」というタブが出現しており、その中で「Source not found」と言われている。
……これはつまりええと。View.classが見つからないよってことなの?
詳しく調べるのはまた今度にします。
今回せっかくなのでソースを貼り付けてみようと思い、どうせならあのソースをきれいに貼ってるやつを使ってみたい!と思ったので、SyntacHighlighterを使ってみようと思ったのですが、うまく表示されませんでした。 で、結局ソース貼り付けず。 こちらもまた今度時間があるときに挑戦します。
No.7
2011/05/25 (Wed) 23:01:44
バイト先で作ってるアプリ。
どういう内容かは言ったらまずいと思いますが、技術的な話は多少してもいいよね……??
キーボードが出現したときに、残った画面領域でページをスクロールする方法について模索しています。
これだけ多くのアプリで実装されているにも関わらず、さっぱりやり方が見つからないんですが。
画面縦サイズ-キーボード縦サイズでスクロールするようにしてやればいいと思うのですが、調べた感じキーボード縦サイズ取得が難儀そう。
今文字を打ってる時にも、予測変換が消えたり出たりする度に上下する背後が気になる。
うーん、Androidのソースとか見たら何かヒントがあるのかなあ。
あとちょこっとmixiアプリの話。
なんかSDKが出たみたいですね。
OAuth認証の必要がなくなるらしい!!
色々調べて作ってみたいのですが、本日も帰宅が0時を過ぎるのでした。
どういう内容かは言ったらまずいと思いますが、技術的な話は多少してもいいよね……??
キーボードが出現したときに、残った画面領域でページをスクロールする方法について模索しています。
これだけ多くのアプリで実装されているにも関わらず、さっぱりやり方が見つからないんですが。
画面縦サイズ-キーボード縦サイズでスクロールするようにしてやればいいと思うのですが、調べた感じキーボード縦サイズ取得が難儀そう。
今文字を打ってる時にも、予測変換が消えたり出たりする度に上下する背後が気になる。
うーん、Androidのソースとか見たら何かヒントがあるのかなあ。
あとちょこっとmixiアプリの話。
なんかSDKが出たみたいですね。
OAuth認証の必要がなくなるらしい!!
色々調べて作ってみたいのですが、本日も帰宅が0時を過ぎるのでした。
カレンダー
| 11 | 2025/12 | 01 |
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
最新記事
(03/13)
(01/08)
(06/08)
(05/29)
(05/28)
最新TB
プロフィール
HN:
柊里緒
性別:
女性
職業:
学生
自己紹介:
使用端末:IS05
この小ささがとても嬉しい。他のスマホ片手で使えません。
PC:Windows7(32ビット版)
最近やや不審な動きをするのが怖い。
備考:VOCALOID大好きです。
twitterやってます。
この小ささがとても嬉しい。他のスマホ片手で使えません。
PC:Windows7(32ビット版)
最近やや不審な動きをするのが怖い。
備考:VOCALOID大好きです。
twitterやってます。
カウンター
ブログ内検索
P R