2016年8月13日土曜日

エラー FloatingActionButton のインポートができない。 import android.support.design.widget.FloatingActionButton;

import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;

でエラーがでる!!

何でだ

調べたところ、ライブラリーのヴァージョンが悪いらしい。

compile 'com.android.support:design:23.4.0'
↓
compile 'com.android.support:design:23.1.0'

に変更して、ビルドするとエラーがでなくなりました。

2016年7月28日木曜日

エラー java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams

Fragmentを用いた時にこのようなエラーがでた。

エラー java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams

原因

@Overridepublic void onAttach(Activity activity) {
    super.onAttach(activity);    try {
        mListener = (OnFragmentInteractionListener) activity;    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString()
                + " must implement OnFragmentInteractionListener");    }
}

onAttachのオーバーライド忘れ


オー恥ずかしい。。。。

格闘すること2時間でした。

2016年6月2日木曜日

エラー Expected resource oy type styleable 何も問題ないのに、R.も記述しているのに @SuppressWarnings("ResourceType")

そんなときはActivityの上に
@SuppressWarnings("ResourceType")


例)
@SuppressWarnings("ResourceType")

public class hogeActivity extends Activity implements OnTouchListener {


}


こうすると、エラーがでなくなります。

2015年12月10日木曜日

エラー Error:Execution failed for task ':compileDebugAidl'. > Executor Singleton not started

Error:Execution failed for task ':compileDebugAidl'.
> Executor Singleton not started

このようなエラーがでた。

調べるとGradleのバージョンが低いらしい。


Gradleのバージョンアップ
をしたらエラーがでなかった。


Gradleのバージョンアップ方法

プロジェクトでマウスホバーして、右クリック→「Opne Module Setting」

でプロジェクトを選択



2015年10月20日火曜日

SQLite使い方 --01 導入編

Android端末内で情報を保存する際に、
以前紹介した

http://androidgamepark.blogspot.jp/2013/01/preferencemanager-sharedpreferences.html

もありますが、今回はSQLiteを使ったデータ管理方法を記します。

また、SQLの事を深く掘り下げはしないので、SQLが何かよくわからない人はこの先は見てもいいことないです。。。

とりあえずの今回はSQLite導入方法を紹介します。

使うのは
SQLiteDatabaseと
SQLiteOpenHelperをextendしたクラスです。

■DBコネクト

public class SQliteOpenHelperClass extends SQLiteOpenHelper {

    public SQliteOpenHelperClass(Context c) {
        super(c, DB, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL(DROP_TABLE);
        onCreate(db);
    }
}

これを通して、DBに接続したり、クエリーを発行します。

SQliteOpenHelperClass oSQLhlpr = new SQliteOpenHelperClass( getApplicationContext());

SQLiteDatabase oDB = oSQLhlpr.getWritableDatabase();

こんな感じで生成します。引数にContextですね。
getWritableDatabase()でデータベースにコネクトします。

コネクト時にOnCreateを読んで、
テーブルが存在しなかったら、テーブルを作成します。

onUpgradeは引数のDBバージョンがテーブル作成時より大きかったら呼ばれます。



■クエリー

・select系
Cursor型 = rawQuery(String sql文, String[] selectionArgs)

Cursor型 = query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)

・insert専用
long型 = insert(String table, String nullColumnHack, ContentValues values)

・引数がいらない場合(insert系)
execSQL(文字列鋳型(SQL文))

クエリーの取得するメソッドはいろいろあります。

■サンプルソース
・メインアクティビティー
package jp.co.appli.sqlitetest;

import android.app.Activity;

import android.app.ActionBar;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.ListView;

public class MainActivity extends Activity implements View.OnClickListener {

    static final String DB           = "sqlite_sample.db";
    static final int DB_VERSION      = 1;
    static final String TABLE_NAME   = "sample_table";
    static final String CREATE_TABLE = "create table " + TABLE_NAME +" ( sample_id integer primary key autoincrement, test_id integer not null, memo text not null );";
    static final String DROP_TABLE   = "drop table "+ TABLE_NAME +";";
    static SQLiteDatabase oDB;
    private SampleAdapter sampleAdapter;

    //レイアウトパラメータ
    private final int WC = ViewGroup.LayoutParams.WRAP_CONTENT;
    private final int MP = ViewGroup.LayoutParams.MATCH_PARENT;
    private ListView listView;

    private CharSequence mTitle;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //メイン画面の作成
        LinearLayout oLayout =new LinearLayout( getApplicationContext());
        oLayout.setOrientation(LinearLayout.VERTICAL);
        setContentView(oLayout);

        //リストビューの作成
        listView      = new ListView(getApplicationContext());

        //リストビューのアダプターを作成
        sampleAdapter = new SampleAdapter(getApplicationContext());

        //SQLiteとの橋渡しするクラス
        SQliteOpenHelperClass oSQLhlpr = new SQliteOpenHelperClass( getApplicationContext());
        //DBに接続する
        oDB = oSQLhlpr.getWritableDatabase();

        //セレクト分の実行結果を取得
        Cursor cursor = oDB.query( TABLE_NAME, new String[] {"sample_id", "test_id", "memo"}, null, null, null, null, "sample_id DESC");

        //アダプターの作成
        makeAdapter(cursor);
        cursor.close();

        //リストビューにアダブターを設定
        listView.setAdapter( sampleAdapter );
        listView.setLayoutParams( new ActionBar.LayoutParams( WC, MP ) );

        //リスト選択時の処理を記述
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            //選択されたリストを消去する処理
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {

                //アダプタから、アイテムを取得
                ItemClass item = sampleAdapter.getItem(position);
                //デリートメソッドを発行
                oDB.delete( TABLE_NAME, "sample_id = ?", new String[]{ String.valueOf(item.getPrimary()) } );

                //テーブル情報を取得
                Cursor cursor = oDB.query( TABLE_NAME, new String[] {"sample_id", "test_id", "memo"}, null, null, null, null, "sample_id DESC");

                //リストビュー内のアダプターを作成
                makeAdapter(cursor);
                cursor.close();

                //Adapteの中身を更新
                sampleAdapter.notifyDataSetChanged();
                //リストビューの再描画
                listView.invalidateViews();
            }
        });

        //追加ボタンの作成
        Button AddBtn = new Button( getApplicationContext() );
        AddBtn.setOnClickListener( this );
        AddBtn.setId( 1 );
        AddBtn.setText( "追加" );
        AddBtn.setLayoutParams( new ActionBar.LayoutParams( WC,WC ) );

        //削除ボタンの作成
        Button DelBtn = new Button( getApplicationContext() );
        DelBtn.setOnClickListener( this );
        DelBtn.setId( 2 );
        DelBtn.setText( "全削除" );
        DelBtn.setLayoutParams( new ActionBar.LayoutParams( WC,WC ) );

        oLayout.addView( AddBtn );
        oLayout.addView( DelBtn );
        oLayout.addView( listView );

    }



    private void makeAdapter( Cursor cursor )
    {
        sampleAdapter.truncateItemList();
        for (boolean next = cursor.moveToFirst(); next; next = cursor.moveToNext())
        {
            ItemClass item = new ItemClass();
            item.setPrimary( cursor.getInt( 0 ) );
            item.setMemo( cursor.getString( 2 ) );
            sampleAdapter.addItem(item);
        }
    }


    @Override
    public void onClick(View view)
    {
        if (view.getId() == 1)
        {
            ContentValues values = new ContentValues();
            values.put( "test_id", 4 );
            values.put( "memo", "こんなところに来てしまったあ" );
            oDB.insert( "sample_table", null, values );

            Cursor cursor = oDB.query( TABLE_NAME, new String[] {"sample_id", "test_id", "memo"}, null, null, null, null, "sample_id DESC");
            makeAdapter(cursor);
            cursor.close();

        }
        else if (view.getId() == 2)
        {
            //全件削除
            oDB.delete("sample_table", "test_id like '%'", null);

            //全件取得メソッド
            Cursor cursor = oDB.query("sample_table", new String[] {"sample_id", "test_id", "memo"}, null, null, null, null, "sample_id DESC");
            makeAdapter(cursor);
            cursor.close();
        }

        //Adapteの中身を更新
        sampleAdapter.notifyDataSetChanged();
        listView.invalidateViews();
    }

    public class SQliteOpenHelperClass extends SQLiteOpenHelper
    {

        public SQliteOpenHelperClass(Context c) {
            super(c, DB, null, DB_VERSION);
        }

        @Override
        public void onCreate( SQLiteDatabase db )
        {

            db.execSQL( CREATE_TABLE );
        }

        @Override
        public void onUpgrade( SQLiteDatabase db, int oldVersion, int newVersion )
        {
            db.execSQL( DROP_TABLE );
            onCreate(db);
        }
    }
}




・アダプタクラス
package jp.co.appli.sqlitetest;
import android.content.Context;
import android.graphics.Color;
import android.view.ViewGroup;
import android.view.View;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.List;
import java.util.ArrayList;


public class SampleAdapter extends BaseAdapter
{
    //コンテキストを取得
    private Context mContext;
    //リスト情報を格納している配列
    private List<ItemClass> dataList = new ArrayList<ItemClass>();
    //レイアウトパラムの定数
    private final int MP = ViewGroup.LayoutParams.MATCH_PARENT;

    //コンストラクターで生成時に呼ばれる
    public SampleAdapter( Context context )
    {
        //生成時のコンストラクターでコンテクストを取得
        mContext = context;
    }

    @Override
    public int getCount()
    {
        //リストの行数
        return dataList.size();
    }

    @Override
    public ItemClass getItem(int posion)
    {
        //配列の中身を返す
        return dataList.get(posion);
    }

    @Override
    public long getItemId(int posion) {
        //現在の配列の場所
        return posion;
    }

    @Override
    public View getView(int position, View view, ViewGroup parent) {

        View v = view;
        if( v == null ){

            //グリットビューの1マス内のレイアウトを作成
            LinearLayout oListLayout = new LinearLayout(mContext);
            //左から右にアイテムを追加
            oListLayout.setOrientation(LinearLayout.HORIZONTAL);
            //テキストビューを生成
            TextView primaryText  = new TextView(mContext);
            //文字大きさの指定
            primaryText.setTextSize(10);
            //文字の色も指定
            primaryText.setTextColor(Color.BLACK);
            //判別用にタグをつける
            primaryText.setTag( "primary" );

            //テキストビューを生成
            TextView memoText  = new TextView(mContext);
            //文字大きさの指定
            memoText.setTextSize(15);
            //文字の色も指定
            memoText.setTextColor(Color.BLACK);
            //判別用にタグをつける
            memoText.setTag("memo");

            oListLayout.addView( primaryText );
            oListLayout.addView( memoText );
            v = oListLayout;
        }

        ItemClass item = getItem( position );

        //配列から、アイテムを取得
        if( dataList != null)
        {
            //タグからテキストビューを取得
            TextView primaryText = (TextView)v.findViewWithTag( "primary" );
            //取得したテキストビューに文字列を設定
            primaryText.setText( String.valueOf( item.getPrimary() ) );

            TextView memoText = (TextView)v.findViewWithTag( "memo" );
            //取得したテキストビューに文字列を設定
            memoText.setText( String.valueOf( item.getMemo() ) );
        }

        return v;
    }

    //データリストの追加
    public void addItem(ItemClass item)
    {
        dataList.add( item );
    }

    //データリストの削除
    public void deleateItem(int iPos){
        dataList.remove(iPos);
    }

    public void truncateItemList(){
        dataList.clear();
    }
}

class ItemClass
{
    private String memo;
    private int    primary;

    public void setMemo( String _memo )
    {
        memo = _memo;
    }

    public void setPrimary( int _primary )
    {
        primary = _primary;
    }


    public String getMemo()
    {
        return memo;
    }

    public int getPrimary()
    {
        return primary;
    }

}


■実行結果
1.初期表示

2.追加ボタンを押す

3.行を選択すると消える(途中の数字が抜けてる)


4.全削除を押すと全部消える

5.また、追加できる(auto incrementなので数字は受け継がれる)


こんな感じになります。

■select

//全件取得メソッド
Cursor cursor = oDB.query( TABLE_NAME, new String[] {"sample_id", "test_id", "memo"}, null, null, null, null, "sample_id DESC");

クエリーのところはPDOのノリで大丈夫です。

第3引数にWHERE句、第4引数にパラメータをわたします。

//sample_idの18と20のみを取得する
Cursor cursor = oDB.query( TABLE_NAME, new String[] {"sample_id", "test_id", "memo"}, "sample_id = ? or sample_id = ?", new String[]{"18", "20" }, null, null, "sample_id DESC");

? の場所にパラメータを代入させます。型は文字列で。

■cursor
makeAdapterの
            item.setPrimary( cursor.getInt( 0 ) );
            item.setMemo( cursor.getString( 2 ) );

ここで、メソッドの取得結果を格納しています。
指定したフィールドから、配列で値が返ってきます。


 今回はサンプルソースなので、いろいろな場所から、クエリーを発行していますが、
実際にリリースするアプリでは、クエリーの作成する場所や発行する場所は決めておいた方がいいと思います。

このソース内のSQliteがどのようにデータを持っているか確認するには、
http://androidgamepark.blogspot.jp/2015/10/androidsqlite-sqlite.html

を参照して下さい。

2015年10月1日木曜日

Android端末内(もしくはエミュレータ)のSQLite確認方法 SQLite保存場所 コマンド一覧

Android端末内(エミュレータ)のSQLite確認方法


1.指定したアプリのSQLiteに接続しよう!!

 ①SQLiteを確認したい端末(もしくはエミュレータに)に接続
 ②端末から、Sqliteに接続

まず①の手順
Android-SDK のパス
下画像のSDK Pathのパス



にターミナルで移動(Windowsはコマンドプロンプト)
platform-tools/
に移動

パスとしてはこうなっている状態で
/sdk/platform-tools

./adb shell

このコマンド打って成功すると、

root@android:/ #

左側に上記のような文字が書かれる。
注意点としては、PCに接続した端末あるいはエミュレータが起動していること!!

これで①完了

②手順

root@android:/ #
この状態でお願い致します。

■DB保存場所
/data/data/パッケージ名/databases/DB名(拡張子が.dbのファイル)
例えば
/data/data/jp.co.appli.sqlitetest/databases/sqlite_sample.db

※補足
コマンドはリナックスなので、
ディレクトリ移動は
cd
ファイル一覧表示は
ls
こんな感じで移動
cd /data/data/jp.co.appli.sqlitetest/databases/


■SQLiteの立ち上げ
sqlite3 DBパス

カーソル左側が
sqlite>
になれば接続完了

上手く行かない人はDBのディレクトリに移動してから、
sqlite3 DB名

最後に
■SQLiteコマンド一覧

・テーブル一覧表示
.tables

・テーブルの構造確認
.schema
もしくは
.schema テーブル名

・終了
.exit

2015年4月3日金曜日

Apple 価格改定 2015/04/02版 tier 一覧 表

Appleが円安により価格改定が行われました。


Appleのことなので、Androidでは関係ないのですが、




2014年11月19日水曜日

エラー;INSTALL_FAILED_DUPLICATE_PERMISSION

INSTALL_FAILED_DUPLICATE_PERMISSION

というエラーが出現

AndroidManifest.xmlはまったくいじっていないのに。。。


http://stackoverflow.com/questions/24757537/android-adb-update-google-play-services-failure

デバック中の アプリをアンインストールするとこのエラーが出なくなったとの報告があるので、自分も試したら解決!!

よくわからないけど、これは頻繁に起こるのか??

Eclipseから、Android Studioへ簡単移行

Eclipseの環境から、AndroidStudioに移行をしています。

gradleの書き換えとか、libの追加とかお手製で作業を行っていたのですが、eclipseでgradleでエクスポートできる事を知ったので、共有します。

Eclipse立ち上げ
移行したいプロジェクトのあるワークスペースを立ち上げ
右クリック
エクスポート


この画面で Generate Gradle build files
を選択

すると、Gradleでビルドされます。

AndroudStudioでimportすれば完了!!

簡単です。

2014年11月18日火曜日

エラー;ADB not responding.If you'd like to retry, then please manually kill "adb" and click 'Restart'

ADB not responding.If you'd like to retry, then please manually kill "adb" and click 'Restart'



このようなエラーがでました。

何かSDKの場所を変えたことが悪いっぽい。。。

Genymoutionを立ち上げて、SDKのパスを更新。




この場所はパスの変更を忘れていたことを思い出した。

これで、無事にビルドができて実行できました。

SDKのパスを変更する際には影響範囲にご注意

2014年11月14日金曜日

エラー;The Android SDK folder can no longer be inside the application folder. 〜〜〜〜 AndroidStudio アップデートしたら、エラーが出現

AndroidStudioがバージョンアップできたので、バージョンアップしたら、エラーがでました。

The Android SDK folder can no longer be inside the application folder.
Please move it to a different location such as your home folder.
When the IDE restarts it will prompt you to enter the new location.


英検4級なので翻訳できましたが、Android SDKフォルダの場所を変えてくれという、文句っぽいので、AndroidStudioの外のフォルダに移動したら、無事にアップデートできました。

アップデートして、適当にプロジェクトをオープンしたら、案の上
「SDKがない」
と怒られたので、SDKの場所を指定して、無事にプロジェクトをオープンできました。



2014年10月29日水曜日

高速エミュレーター(Genymotion)を導入。Androidのエミュレータ本当に遅い!!との決別

Android開発で本当に嫌気がさすことの一つにエミュレータの起動が遅い!!
そんな思いもうしたくないですよね??

そんな、あなたに今日オススメしたいのが

「Genymotion」

高速なエミュレータとして、Android開発者界隈では結構有名らしいです。

https://shop.genymotion.com/index.php?controller=order-opc

このページで
Freeのダウンロードを選びましょう

そうするとログインが求められるので、適当なemailアドレスとパスワードを準備して、
新規アカウントの作成。

アカウント作成して、再挑戦すると、




上のページで表示されるので、適時ダウンロードして、インストールしてください。


インストールして、開けました??

開けない方は
「virtualbox」
が必要な方なので、インストールしてください。

https://www.virtualbox.org



左側のDownloadを押すとダウンロードに進みます。
インストール完了して、再度Genymotionを開いて下さい。



こんな画面がでればインストール成功です。

Addボタンを押して、端末をインストールします。


お好みの端末を選んで、Nextボタンを押下
ログイン・パスワードが聞かれるので、入力したら追加されます。



追加した端末を選んで、Startを押すとエミュレータが起動します。

AndroidのIDEでプロジェクトを実行すると、


こんな感じで使えます。(できない人はプロジェクトの実行構成を確認してね。RunCinfig〜です。)




2014年9月25日木曜日

Eclipseから、Android Studioへ移行してみた

Eclipseから、Android Studioへ移行してみた

Android Studio

http://developer.android.com/sdk/installing/studio.html#download
↑
ここから、ダウンロードできます。

特徴&感想
・ベースのIDEが『IntelliJ』
→『Eclipse』はIDEの名称です。IDEがわからない人は特に気にしなくても
・コード補完やリファクタリング機能が賢くなった。と感じる。
→リソースの紐付けも、ズレにくくなっていると感じます。。。。
・見た目がかっこいい!!
→Preferences→Appearance→ ThemeをDarculaにすると、なかなか
・Gitの管理が簡単!!
・Android SDK Managerの初回のインストールが不要!!
→落としてから、いきなり使えます!!(MAC *Windowsは環境パスの設定とかJDKが必要かも??)
・ログが見やすい。。
・ワークスペースがいらない!!
→ビルドツールと各プロジェクトのモジュールの管理方法が『Eclipse』と異なります。




まとめ
・使ってみると、ストレートにいい感じです。『Eclipse』でできていたことは大抵できるし、直感的に操作できるUIになっているかと思います。
今後はAndroidStudioで開発していこうと思います。

2014年3月17日月曜日

ListView -02 (リストの追加、スクロールの一番下を検知、スクロールが一番下になったら追加,行の高さの固定)

もっと自由にListViewを使う

わりと使うことが多いリストビュー。

わりと小さい機能だけど、たまに欲しくなる機能をまとめてみました。

ListViewはじめての方はこちらのページを確認してね。
http://androidgamepark.blogspot.jp/2013/09/listview-baseadapter.html


今日紹介するのはこちら、

1.リストの区切りの線を入れる。線の色を変える
2.リストの削除
3.一番下まで、スクロールしたら、リストに追加する
4.行の高さを固定したい

この3つの機能を紹介します。

1.の線の色に関しては、

ListView oListView   = new ListView( getApplicationContext() );
//行間の線色を指定
oListView.setDivider( new ColorDrawable( Color.RED ) );
//線の太さ
oListView.setDividerHeight( 2 );

setDividerを使えばOKです。色の指定はColorDrawableを使用して下さい。
また、線の太さを指定しないと線が出てないので、注意!!

2.のリストの削除に関しては、
ListAdapterの中身を削除して、
notifyDataSetChanged();
を呼べば大丈夫です。

3.も
ListAdapterの中身を追加して、
notifyDataSetChanged();
を呼べば大丈夫です。

ただ、一番下まで、スクロールしたかを拾うのに

ListView.setOnScrollListener( this );

をimplementsする必要があります。

4.はリストの高さを指定するだけです。

詳しくはサンプルソースを見てください。

サンプルソースは3ファイルから、構成されます。
MainActivity
ListAdapter
Adapterの中身クラス
の3ファイルです。

◇サンプルソース
■MainWebView

package com.example.ListView;

import android.app.Activity;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.Toast;


public class MainActivity extends Activity implements OnItemClickListener, OnScrollListener, OnItemLongClickListener{

    //レイアウトパラメータ
    private final int MP = ViewGroup.LayoutParams.MATCH_PARENT;
    //リスト情報を格納した配列
    private ListAdapter oAdp;
    //行の挿入が可能かのフラグ
    private boolean bChk = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //レイアウトの生成
        LinearLayout oLayout = new LinearLayout( this );
        //レイアウトを画面に反映
        setContentView(oLayout);

        //リストビューの生成
        ListView oListView   = new ListView( this );
        //レイアウトパラムの設定
        oListView.setLayoutParams( new LayoutParams( MP,MP ) );
        //行間の線色を指定
        oListView.setDivider( new ColorDrawable( Color.RED ) );
        //線の太さ
        oListView.setDividerHeight( 2 );
        //リストをクリックした時の処理を設定
        oListView.setOnItemClickListener( this );
        //リストをスクロールした時の処理を設定
        oListView.setOnScrollListener( this );
        //リストを長押しした時の処理を設定
        oListView.setOnItemLongClickListener( this );

        //リストビューに入れるアイテムAdapterを生成
        oAdp = new ListAdapter( getApplicationContext() );
        //Adapterにアイテムを追加
        Add_DataList();
        //Adapteの中身を更新
        oAdp.notifyDataSetChanged();

        //リストビューにアイテムadapterを設定
        oListView.setAdapter( oAdp );
        //リストをレイアウトに追加
        oLayout.addView( oListView );
    }

    //アダプターにアイテムを追加
    private void Add_DataList(){
        for (int i = 0; i < 13; i ++){
            //配列にタイトルと画像を格納
            if ( i == 12 ){
           oAdp.Set_Datalist(new ListItem(String.valueOf("番号:" + i), "むかしむかしあるところにおじいさんとおばあさんがいました。おばあさんはかわにせんたくにおじいさんはやまにしばかりにいってました。FINISH!!", R.drawable.ic_launcher));
            }else{
           oAdp.Set_Datalist(new ListItem(String.valueOf("番号:" + i), "Hello, Goodbye, Hello Goodbye", R.drawable.ic_launcher));
            }
        }
    }

    @Override
    public void onItemClick(AdapterView parent, View view, int position, long id) {
        //クリックされた項目を取得
        ListItem oList = oAdp.getItem(position);
        //押された時のパラメーターを表示
        Toast.makeText(getApplicationContext(), "押下されたのは:" + oList.Get_Title(), Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onScroll(AbsListView view, int iTop, int iVisible, int iTotal) {
        boolean bLast = iTotal == iTop + iVisible;
        //最終行であるかの確認
        if (bLast && bChk) {
            Add_DataList();
            oAdp.notifyDataSetChanged();
        }
    }


    @Override
    public void onScrollStateChanged(AbsListView view, int scrollState) {
        // スクロールの状態を検知する
        switch (scrollState) {
           // スクロールしていない
    case OnScrollListener.SCROLL_STATE_IDLE:
              // スクロール中であることを示すフラグをfalseに
              bChk = false;
              break;
    // スクロール中
          case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
              bChk = true;
            break;
          // はじいたとき
          case OnScrollListener.SCROLL_STATE_FLING:
              break;
        }
    }

    @Override
    public boolean onItemLongClick(AdapterView parent, View view, int positon, long id) {
        //データリストを削除
        oAdp.Del_Datalist(positon);
        //Adapteの中身を更新
        oAdp.notifyDataSetChanged();
        return false;
    }
}


■ListItem
package com.example.ListView;

public class ListItem {


    private String sTitleText;
    private String sDetailText;
    private int    iResource;

    public ListItem(String sTitle, String sDetail, int iRes){
        //文字列を取得
    sTitleText     = sTitle;
        //画像のResIDを取得
        iResource      = iRes;
        //リスト内の詳細について
        sDetailText    = sDetail;
    }

    public String Get_Title(){

        //文字列を返す
        return sTitleText;
    }

    public String Get_Detail(){

        //文字列を返す
        return sDetailText;
    }

    public int Get_Resource(){

        //画像のResIDを返す
        return iResource;
    }
}


■ListAdapter

package com.example.ListView;

import java.util.ArrayList;

import java.util.List;

import android.content.Context;

import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

public class ListAdapter extends BaseAdapter{

    //コンテキストを取得
    private Context mContext;
    //リスト情報を格納している配列
    private List<ListItem> dataList = new ArrayList<ListItem>();
    //レイアウトパラムの定数
    private final int MP = ViewGroup.LayoutParams.MATCH_PARENT;

    //コンストラクターで生成時に呼ばれる

    public ListAdapter(Context context){
        //生成時のコンストラクターでコンテクストを取得
        mContext = context;
    }

    @Override

    public int getCount() {
        //リストの行数
        return dataList.size();
    }

    @Override

    public ListItem getItem(int posion) {
        //配列の中身を返す
        return dataList.get(posion);
    }

    @Override

    public long getItemId(int posion) {
        //現在の配列の場所
        return posion;
    }

    @Override

    public View getView(int position, View view, ViewGroup parent) {

        View v = view;

        if( v == null ){
            //グリットビューの1マス内のレイアウトを作成
            LinearLayout oListLayout = new LinearLayout(mContext);
            //左から右にアイテムを追加
            oListLayout.setOrientation(LinearLayout.HORIZONTAL);

            LinearLayout oTextLayout = new LinearLayout(mContext);

            oTextLayout.setOrientation(LinearLayout.VERTICAL);

            //イメージビューを生成

            ImageView oImage = new ImageView(mContext);
            //テキストビューを生成
            TextView oTitle  = new TextView(mContext);
            TextView oDetail = new TextView(mContext);

            //文字大きさの指定

            oTitle.setTextSize(20);
            oDetail.setTextSize(15);

            //文字の色も指定

            oTitle.setTextColor(Color.BLACK);

            //判別用にタグをつける

            oImage.setTag("CellImage");
            oTitle.setTag("CellTitle");
            oDetail.setTag("CellDetail");

            //テキストレイアウトにビューを追加

            oTextLayout.addView(oTitle);
            oTextLayout.addView(oDetail);
            oTextLayout.setLayoutParams(new LayoutParams(MP, 120));
         
            //グリットビュー用のレイアウトに追加
            oListLayout.addView(oImage);
            oListLayout.addView(oTextLayout);
            v = oListLayout;
        }

        //配列から、アイテムを取得

        ListItem oList = getItem(position);
        if( dataList != null){
            //タグからテキストビューを取得
            TextView title = (TextView) v.findViewWithTag("CellTitle");
            //取得したテキストビューに文字列を設定
            title.setText(oList.Get_Title());

            //タグからテキストビューを取得

            TextView detail = (TextView) v.findViewWithTag("CellDetail");
            //取得したテキストビューに文字列を設定
  detail.setText(oList.Get_Detail());
       
  //タグからイメージビューを取得
            ImageView imag = (ImageView) v.findViewWithTag("CellImage");
            //イメージビューに画像を設定
            imag.setBackgroundResource( oList.Get_Resource() );
        }

        return v;

    }

    //データリストの追加

    public void Set_Datalist(ListItem oList){
        dataList.add(oList);
    }
 
    //データリストの削除
    public void Del_Datalist(int iPos){
        dataList.remove(iPos);
    }
}

■実行結果






こんな感じになります。

一番下までスクロールしたら、12行追加される。
行を長押ししたら、その行が削除される。

タッチイベントを拾って、数字がずれていないことを確認OK

注意点としては

implements OnItemClickListener, OnScrollListener, OnItemLongClickListener

implementsが複数あることを注意して下さい。

2014年2月20日木曜日

エラー (ADT のこのバージョンは Android SDK ツールの改訂 ~)This Android SDK requires Android Developer Toolkit version or above. Curre...version is Please update ADT to the latest version.


eclipseを立ち上げたら、こんなエラーがでた!!

ADTのバージョンが古いのかな??

SDKツールとか言っているので、




SDKマネージャーを立ち上げ

~22.3と書いてあったので、
Android SDK Toolsにチェックを入れて、インストール




eclipseを再起動したら、OK!!

ダイアログは出現しなくなりました!!


が、しかしBuildが上手くできない!!
R.~がエラーになる


Android SDK Build-toolsもインストールしなければダメぽ


2014年2月17日月曜日

ファイルの書き込み、生成(FileOutputStream, file:///data/data/)

ファイルの読み込みをやったので、今回はファイルの書き込みを。

//アウトプットストリームの生成
openFileOutput( ファイル名:String型, モード:int型)

こんな感じで使います。↓
FileOutputStream oOutStreame = openFileOutput( "test.htmk", MODE_PRIVATE );

モードの定数はこちら

MODE_WORLD_READABLE   他のアプリから参照可
MODE_WORLD_WRITEABLE  他のアプリから書き込み可
MODE_PRIVATE                他のアプリからアクセス不可
MODE_APPEND                  ファイルがあると、追記


また、モードを複数指定する場合には
パイプを繋げると複数指定できます。

MODE_PRIVATE | MODE_APPEND


また、ファイルの保存場所は

file:///data/data/" パッケージ名 + /files/ + 作成したファイル名

こちらになります。

SDカードに保存する方法に関しては、また今度


■サンプルソース
package com.example.filemgr;

import java.io.FileOutputStream;
import java.io.IOException;

import android.os.Bundle;
import android.app.Activity;
import android.webkit.WebView;
import android.widget.LinearLayout;

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  //ファイル名
  String sFileName  = "test.html";
  //書き込み内容
  String sText      = "<font color=\"red\">Goodbye World!!</font>";
  try {
           //アウトプットストリームの生成
    FileOutputStream oOutStreame = openFileOutput(sFileName, MODE_PRIVATE | MODE_APPEND);
//アウトプットストリームに書き込み
  oOutStreame.write(sText.getBytes());
  } catch (IOException e) {
  // TODO 自動生成された catch ブロック
e.printStackTrace();
  }
  //WebViewの生成
        WebView oWebView = new WebView( getApplicationContext() );
  //ファイルの保存先はこちらだ↓    "file:///data/data/パッケージ名 + files + 作成したファイル名

        String sUrl = "file:///data/data/" + getPackageName() +"/files/" + sFileName;oWebView.loadUrl( sUrl );
      
  //レイアウトの生成とテキストの貼り付け
        LinearLayout oLayout = new LinearLayout(getApplicationContext());
        oLayout.addView(oWebView);
        //レイアウトを表示
        setContentView(oLayout);
  }
}

■実行結果



今回は拡張子をhtmlにしましたが基本的には、何でも大丈夫です。
注意点としては、ファイルを書き込む際にフルパスを指定しないことです。


2014年2月9日日曜日

ローカルファイルの読み込み(getAssets(), BufferedReader)

これの続きです。
前回は「assets」の配下に「test.html」を作成して、
そのファイルをhtmlとして、読み込みましたが、
今回は中のファイルに何が書かれているかを見たいと思います。

注意点としては、assets配下のファイルは読み込みはできるけど、
書き込みはできません。
もう一度言います。
assets配下のファイルは読み込み可、書き込み不可です。
自分は書き込みをしたくて、一週間くらい調べましたができませんでした。

できる方法もあるかもしれませんが。。。 
リファレンス的には読み込み専用となっています。

http://developer.android.com/reference/android/content/res/AssetManager.html


■サンプルソース
package com.example.filemgr;

import java.io.BufferedReader;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import android.os.Bundle;
import android.app.Activity;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //インプットストリームの作成
        InputStream oInStream;
        String lineBuffer;
        String str = "";
        try {
            //assetsに存在するtest.htmlを開くという命令
            oInStream = getAssets().open("test.html");
            //リーダーでインプットストリームの内容を読む
            BufferedReader reader= new BufferedReader(new InputStreamReader(oInStream,"UTF-8"));
            while( (lineBuffer = reader.readLine()) != null ){
                str = str + lineBuffer;
            }
        } catch (IOException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }

        //テキストビューの作成
        TextView oTextView = new TextView(getApplicationContext());
        oTextView.setText(str);

        //レイアウトの生成とテキストの貼り付け
        LinearLayout oLayout = new LinearLayout(getApplicationContext());
        oLayout.addView(oTextView);

        //レイアウトを表示
        setContentView(oLayout);
    }
}


■実行結果


■実行結果

みづらいけど、
前回作成したファイルの中身が見れました。。。

//リーダーでインプットストリームの内容を読む
BufferedReader reader= new BufferedReader(new InputStreamReader(oInStream,"UTF-8"));
while( (lineBuffer = reader.readLine()) != null ){
    str = str + lineBuffer;
}
↑
ここらへんの処理はAndroidではあんまり使いませんが、
JAVAではよく使う処理です。

oInStream = getAssets().open("test.html");

↑
これがミソです。

getAssets()で、アセットフォルダを取得しています。(イメージとして)

なので、ファイル名の指定だけで開けます。
これはAndroid特有の処理です。


AndrdoiMainifest.xml-03 (ホーム画面とアイコン, android.intent.category.LAUNCHER)

あまり使う機会がないと思いますが、
android.intent.category.LAUNCHER
を複数のActivityに記述した時の挙動を紹介したいと思います。

一応

このページの続きなので、訳わからない人は上のリンクを参照してください。


用意するものは

複数のActivity
複数のicon

■サンプルソール
・メインのアクティビティ

package co.jp.test.manifest.xml;

import android.os.Bundle;
import android.app.Activity;
import android.widget.LinearLayout;
import android.widget.TextView;

public class MainActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  //テキストビューの生成
  TextView oTextView = new TextView(getApplicationContext());
  oTextView.setText("メイン画面");

  //LinearLayoutの生成
  LinearLayout oLayout = new LinearLayout(getApplicationContext());
  oLayout.addView(oTextView);
  setContentView(oLayout);
  }
}

・サブのアクティビティ
package co.jp.test.manifest.xml;

import android.os.Bundle;
import android.app.Activity;
import android.widget.LinearLayout;
import android.widget.TextView;

public class SubActivity extends Activity {

  @Override
  protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  //テキストビューの生成
  TextView oTextView = new TextView(getApplicationContext());
  oTextView.setText("サブ画面");

  //LinearLayoutの生成
  LinearLayout oLayout = new LinearLayout(getApplicationContext());
        Layout.addView(oTextView);
  setContentView(oLayout);
  }
}


・AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  package="co.jp.test.manifest.xml"
  android:versionCode="1"
  android:versionName="1.0" >
  <uses-sdk
    android:minSdkVersion="8"
    android:targetSdkVersion="17" />

  <application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:theme="@style/AppTheme" >
    <activity
      android:name="co.jp.test.manifest.xml.MainActivity"
      android:label="activityのラベル" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
    <activity
      android:name="co.jp.test.manifest.xml.SubActivity"
      android:icon="@drawable/icon2"
      android:label="subactivityのラベル" >
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
      </intent-filter>
    </activity>
  </application>
</manifest>


■実行結果



こんな画面が立ち上がると思います。
端末のホーム画面を見ると
"activityのラベル"と書かれたアイコンが表示されています。



一番左下に存在するのが、subactivityです。
AndroidManifest.xmlで最後に記述したactivityです。

タッチすると



ちゃんとサブの方が表示されました。

1つのアプリで複数のアイコンをホーム画面に表示できました。


この機能を使う機会があるのかはわかりませんが。。。