2012年11月20日火曜日

[Android] AVDの作成時に"Error: null"と表示されて作成失敗する。


 Androidのエミュレータを作成するときに作成ボタンを押しても反応せずに、 "Error:null"とだけログに表示される。


 困ったときのStackOverFlowがやはり役に立って、このあたりの回答と参考にすると、 結局のところ環境変数ANDROID_SKD_HOMEに.androidの上のディレクトリ(\Users\toyuserなど)を指定してやればこのエラーは出なくなった。


 問題はなんで今まで作成できたものが出来なくなったのかは分からないけど、とりあえず解決したらかクローズ。

2012年11月9日金曜日

[Android]スライドで大きさを変えられる可変ビュー作ってみた


Androidっていわゆるスライドバーみたいな感じでビューの大きさを変えることって
標準のウィジェットでは用意されていない。

やからスライド(ドラッグ)で大きさを可変にできるビューを作ってみた。

なまえは適当にSlideBarDrugViewControllerとしてみた。
ソースはコチラ(Github)。以下は使い方の簡単なメモ。

レイアウト

スライドバー用のビューと、その上下にビューを用意する。
今回は例なのでビューの種類は何でもいい。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello"
        android:id="@+id/view0"
        android:gravity="center" />

    <TextView
        android:id="@+id/view1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="SlideBar"
        android:background="#6090ef"
        android:gravity="center" />
    
    <Button
        android:id="@+id/view2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="BottomView" />


</LinearLayout>


MainActivity

Mainのアクティビティにレイアウトを読み込ませる。
以下の2点を使用する。
  • (1)で書かれている4つの引数を与える
  • (2)のようにonTouchイベントをcontrollerに渡す

public class SlideBarWidgetActivity extends Activity {
    
 Context context;
 SlideBarDrugViewController controller;
 View upperView;
 View slidebarView;
 View bottomView;
 
 
 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        upperView = (View)this.findViewById(R.id.view0);
        slidebarView = (View)this.findViewById(R.id.view1);
        bottomView = (View)this.findViewById(R.id.view2);
        context = this;
        
    }
    
 public void onWindowFocusChanged(boolean hasFocus) {
  WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
  Display display = wm.getDefaultDisplay();
  final int screenHeight = display.getHeight();
  
        Rect r = new Rect();
        this.upperView.getGlobalVisibleRect(r);
  if(controller == null){
      /**
  * (1)以下の4つの引数を与える
  * drugView 可変ビュー(スライドバーの上部ビュー)
  * slideBarView スライドバーとなるビュー
  * minpx 可変ビューの上部(top)の絶対座標
  * maxHeight スライドバーが下に動く最大サイズ。画面全体の大きさを入れると最下端まで移動させられる
  */
   controller = new SlideBarDrugViewController(upperView, slidebarView, r.top, screenHeight);
  } 
 }
  
 @Override
 public boolean onTouchEvent(MotionEvent event){
           // (2) onTouchイベントをcontrollerに委譲
   return controller.onTouchEvent(event);   
 }
    
}

実行結果

画像では分かりにくいけど、ScrollBarをスライドさせるとそれにあわせて上下のビューの大きさが変化する。