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'
に変更して、ビルドするとエラーがでなくなりました。
Androidアプリを作成したい人必見!!Androidアプリの基本動作はもちろんのこと、本には載っていない、調べても見つからない、ソースを修正するだけでは解決できない、アプリ開発者が直面する問題の解決方法についても記載していきます。 *基本的にはレイアウトファイル(xml)を使わないソースを載せております。
2016年8月13日土曜日
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
原因
onAttachのオーバーライド忘れ
オー恥ずかしい。。。。
格闘すること2時間でした。
エラー 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」
でプロジェクトを選択
> 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
を参照して下さい。
以前紹介した
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
■SQLiteの立ち上げ
sqlite3 DBパス
カーソル左側が
sqlite>
になれば接続完了
上手く行かない人はDBのディレクトリに移動してから、
sqlite3 DB名
最後に
■SQLiteコマンド一覧
・テーブル一覧表示
.tables
・テーブルの構造確認
.schema
もしくは
.schema テーブル名
・終了
.exit
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日金曜日
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
デバック中の アプリをアンインストールするとこのエラーが出なくなったとの報告があるので、自分も試したら解決!!
よくわからないけど、これは頻繁に起こるのか??
というエラーが出現
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すれば完了!!
簡単です。
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のパスを変更する際には影響範囲にご注意
このようなエラーがでました。
何か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の場所を指定して、無事にプロジェクトをオープンできました。
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〜です。)
そんな思いもうしたくないですよね??
そんな、あなたに今日オススメしたいのが
「Genymotion」
高速なエミュレータとして、Android開発者界隈では結構有名らしいです。
このページで
Freeのダウンロードを選びましょう
新規アカウントの作成。
アカウント作成して、再挑戦すると、
上のページで表示されるので、適時ダウンロードして、インストールしてください。
インストールして、開けました??
開けない方は
「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で開発していこうと思います。
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が複数あることを注意して下さい。
わりと使うことが多いリストビュー。
わりと小さい機能だけど、たまに欲しくなる機能をまとめてみました。
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 ファイルがあると、追記
//アウトプットストリームの生成
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) {
@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() );
WebView oWebView = new WebView( getApplicationContext() );
//ファイルの保存先はこちらだ↓ "file:///data/data/パッケージ名 + files + 作成したファイル名
String sUrl = "file:///data/data/" + getPackageName() +"/files/" + sFileName;oWebView.loadUrl( sUrl );
String sUrl = "file:///data/data/" + getPackageName() +"/files/" + sFileName;oWebView.loadUrl( sUrl );
//レイアウトの生成とテキストの貼り付け
LinearLayout oLayout = new LinearLayout(getApplicationContext());
oLayout.addView(oWebView);
//レイアウトを表示
setContentView(oLayout);
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);
}
}
■実行結果
■実行結果
前回は「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"));
//リーダーでインプットストリームの内容を読む
BufferedReader reader= new BufferedReader(new InputStreamReader(oInStream,"UTF-8"));
while( (lineBuffer = reader.readLine()) != null ){
str = str + lineBuffer;
}
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);
}
@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);
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//テキストビューの生成
TextView oTextView = new TextView(getApplicationContext());
oTextView.setText("サブ画面");
TextView oTextView = new TextView(getApplicationContext());
oTextView.setText("サブ画面");
//LinearLayoutの生成
LinearLayout oLayout = new LinearLayout(getApplicationContext());
Layout.addView(oTextView);
setContentView(oLayout);
}
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つのアプリで複数のアイコンをホーム画面に表示できました。
この機能を使う機会があるのかはわかりませんが。。。
登録:
投稿 (Atom)





































