■■■■■■□■■■■■■□■■■■■■□□□□□■■□■■■■■■
■■□□■■□■■□□■■□■■□□□□□■■■■■■□■■□□□□
■■□□■■□■■□□■■□■■□□□□□■■□□■■□■■■■■■
■■□□■■□■■□□■■□■■□□□□□■■□□■■□□□□□■■
■■□□■■□■■■■■■□■■■■■■□■■■■■■□■■■■■■

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

ToastみたいなPopupWindow

※書き忘れ
ToastのようにActivityはまたぎません。
あと、
private int m_nDuration = 4000;
private int m_xOffset = 0;
private int m_yOffset = 64;
この変数をToastと同じ値を取得する
ちゃんとした方法(マジックナンバーじゃなくて)
知ってる方教えてください。

AndroidToastが連続で呼ばれるとキューイングされて好みの動作にならないので、
PopupWindowを継承して、ぽいのを作ってみました(以下toasty)。
面倒なので、自分が使うファンクションだけ実装。

JavaもAndroidもプログラミングは実質半年なので、変なところは優しく教えてくださいw
特にToastyPopupWindow.java:44のキャストはダメな気がする。

m_toastyはアクティビティ内のメンバ変数で一個。
最初だけnewして、あとは使い回しで
dismissして、新しいviewをセットしてshowの繰り返し。
取り合えず所望の動作をしてくれてるので良しとします。

main.java(抜粋)
245                 if (null == m_toasty){
246                     m_toasty = new ToastyPopupWindow(m_context);
247                     m_toasty.setGravity(Gravity.CENTER|Gravity.TOP, 048);
248                     m_toasty.setDuration(5000);
249                 }
250                 else{
251                     m_toasty.dismiss();
252                 }
253 
254                 m_toasty.setView(v);
255                 m_toasty.update();
256                 m_toasty.show();


toasty.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:drawable/toast_frame"
/>


ToastyPopupWindow.java
  1 package com.android.cddatabase;
  2 
  3 import android.app.Activity;
  4 import android.content.Context;
  5 import android.os.Handler;
  6 
  7 import android.widget.RelativeLayout;
  8 import android.widget.PopupWindow;
  9 import android.widget.TextView;
 10 
 11 import android.view.View;
 12 import android.view.Gravity;
 13 import android.view.ViewGroup;
 14 
 15 import android.graphics.Color;
 16 import android.content.res.TypedArray;
 17 
 18 import java.lang.IllegalArgumentException;
 19 
 20 public class ToastyPopupWindow extends PopupWindow {
 21     private final Context m_context;
 22     private static int m_textColor;
 23 
 24     private static final int WC = ViewGroup.LayoutParams.WRAP_CONTENT; 
 25     private static final RelativeLayout.LayoutParams mLayoutParam = new RelativeLayout.LayoutParams(WC, WC);
 26 
 27     private final Handler m_hndDismiss;
 28     private final Runnable m_runDismiss;
 29 
 30     private int m_nDuration = 4000;
 31     private int m_gravity   = Gravity.AXIS_SPECIFIED | Gravity.BOTTOM;
 32     private int m_xOffset   = 0;
 33     private int m_yOffset   = 64;
 34 
 35     ////////////////////////////////////////////////////////////////////
 36     // コンストラクタ
 37     ////////////////////////////////////////////////////////////////////
 38     ToastyPopupWindow(Context context){
 39         super(context);
 40         m_context = context;
 41         setTouchable(true);
 42         setAnimationStyle(android.R.style.Animation_Toast);
 43         setWidth(WC);
 44         setHeight(WC);
 45         setBackgroundDrawable(null);
 46         View v = ((Activity)context).getLayoutInflater().inflate(R.layout.toasty, null);
 47         setContentView(v);
 48 
 49         TypedArray typedarray = m_context.obtainStyledAttributes(
 50                 new int[] {android.R.attr.textColorPrimary});
 51         m_textColor = typedarray.getColor(0, Color.BLACK);
 52 
 53         m_hndDismiss = new Handler();
 54         m_runDismiss = new Runnable(){
 55             public void run(){
 56                 dismiss();
 57             }
 58         };
 59 
 60         setOnDismissListener(new PopupWindow.OnDismissListener(){
 61             @Override public void onDismiss(){
 62                 m_hndDismiss.removeCallbacks(m_runDismiss);
 63             }
 64         });
 65     }
 66     ////////////////////////////////////////////////////////////////////
 67 
 68     ////////////////////////////////////////////////////////////////////
 69     // Toastライクなshow
 70     ////////////////////////////////////////////////////////////////////
 71     public void show(){
 72         View view = ((Activity)m_context).getWindow().getDecorView();
 73         super.showAtLocation(view, m_gravity, m_xOffset, m_yOffset);
 74         m_hndDismiss.postDelayed(m_runDismiss, m_nDuration);
 75     }
 76     ////////////////////////////////////////////////////////////////////
 77 
 78     ////////////////////////////////////////////////////////////////////
 79     // Activityがなくなってからdismissが呼ばれるとエラー
 80     // とりあえず例外処理で対処
 81     ////////////////////////////////////////////////////////////////////
 82     @Override public void dismiss(){
 83         if (isShowing()){
 84             try{
 85                 super.dismiss();
 86             }
 87             catch (IllegalArgumentException e){
 88                 e.printStackTrace();
 89             }
 90         }
 91     }
 92     ////////////////////////////////////////////////////////////////////
 93 
 94     ////////////////////////////////////////////////////////////////////
 95     // ToastライクなsetGravity
 96     ////////////////////////////////////////////////////////////////////
 97     public void setGravity(int gravity, int xOffset, int yOffset){
 98         m_gravity   = gravity;
 99         m_xOffset   = xOffset;
100         m_yOffset   = yOffset;
101     }
102     ////////////////////////////////////////////////////////////////////
103 
104     ////////////////////////////////////////////////////////////////////
105     // PopupWindowの表示時間
106     ////////////////////////////////////////////////////////////////////
107     public void setDuration(int dulation){
108         m_nDuration = dulation;
109     }
110 
111     ////////////////////////////////////////////////////////////////////
112     // ViewGroupの子ビューを全て削除してから
113     // 新しいビューをセットする
114     ////////////////////////////////////////////////////////////////////
115     public void setView(View v){
116         RelativeLayout relativeLayout = (RelativeLayout)getContentView();
117         relativeLayout.removeAllViewsInLayout();
118         relativeLayout.addView(v, mLayoutParam);
119     }
120     ////////////////////////////////////////////////////////////////////
121 
122     ////////////////////////////////////////////////////////////////////
123     // ToastのmakeTextみたいなの
124     ////////////////////////////////////////////////////////////////////
125     static ToastyPopupWindow makeText(Context context, CharSequence text, int dulation){
126         ToastyPopupWindow toasty = new ToastyPopupWindow(context);
127         TextView textView = new TextView(context);
128         textView.setTextColor(m_textColor);
129         textView.setText(text);
130         toasty.setView(textView);
131         toasty.setDuration(dulation);
132         return toasty;
133     }
134     ////////////////////////////////////////////////////////////////////
135 }
136 
137 // vim: et ts=4 sw=4

テーマ:Android - ジャンル:携帯電話・PHS

  1. 2011/11/06(日) 21:29:42|
  2. HTC Aria
  3. | トラックバック:0
  4. | コメント:0
<<vim起動rubyスクリプト for windows | ホーム | Android+Ant+ProGuard環境でSDK r9からr14へのアップデート>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://nocd5.blog59.fc2.com/tb.php/480-e3060b26
この記事にトラックバックする(FC2ブログユーザー)
home

プロフィール

Author:nocd5
30歳(男)
会社員

Last.fm



最近の記事

カテゴリー

カレンダー

07 | 2017/08 | 09
Sun Mon Tue Wed Thu Fri Sat
- - 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 - -

最近のコメント

最近のトラックバック

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

Amazonアソシエイト

RSSフィード

リンク

このブログをリンクに追加する

FC2ブログランキング

FC2Blog Ranking

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。