FC2ブログ
    12 «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.» 02

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【Java】アラームサービスについて① 

    (」・ω・)こんにちは~
    大坂です。

    今週の木曜日にLockPickerがアンドロイダー公認アプリとなりました!
    GagSoundもお気に入り機能を追加し、サウンドを20種類から36種類にしてアンドロイダーの新着アップデートに取り上げられました!
    是非、ダウンロードしてみてください!お願いします!!

    こっそり輝度チェンも設定数を2個から10個の間で変更できるようにアップデートしたのですが、なんとか取り上げてもらえないものですかね・・・?

    さてさて、今週は輝度チェンをアップデートしたり、ドット絵をいじってたりとネタがないんですがタイトルの通り、アラームサービスについてです。
    まずは受け取るクラスを作成。今回は何もせず。
     public class AlarmReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
    Log.d("AlarmReceiver", "とったど~");
    }
    }

    あとは、作成したクラス用のインテントを作成して、アラームに登録して終わりですね。
     // アラーム用のインテントを作成
    Intent alarmIntent = new Intent(this, AlarmReceiver.class );
    // 登録するタイプを設定(後で変更に使ったり)
    alarmIntent.setType("0");
    alarmIntent.setAction("ALARM ACTION");
    // アラーム登録用のペンディングインテントを作成
    PendingIntent pendingIntent = PendingIntent.getBroadcast(this, ALERM_EVENT, alarmIntent, PendingIntent.FLAG_CANCEL_CURRENT );
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    // アラームに登録
    alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), pendingIntent);

    今回は短いですが、こんな感じです。

    間違いとかあったら教えてください!

    ではでは、また来週(´・ω・)ノシ

    Category: 開発日記(Java)

    Thread: 日記

    Janre: 日記

    tb 0 : cm 0   

    【Java】タブの実装について 

    月曜日です。今日は祝日ですが、そんなものありゃしません。
    ってことで、ブログです。あ、坂内です。

    先週の金曜日ですが、「GagSound」バージョンアップしました!!
    サウンドがなんと「36!!」種類に増量!
    そしてお気に入り機能が追加されました!
    これで、気に入ってるサウンドだけのリストを用意できます!
    お気に入りへ入れるには、気に入ったサウンドを長押しでできます。
    逆にお気に入りから外す場合は、お気に入り状態のサウンドを長押しで外すことができます!

    【Gagsound】
    https://play.google.com/store/apps/details?id=com.halcyon.gagsound

    よろしくです!

    で、今回は、このバージョンアップに伴いタブを実装しました。
    そのことについて少し。

    タブを実装するに当たり必要なものは以下になります。
    (タブの切り替えが2つの場合を想定)
    タブ部分に表示する画像
    タブ画像のSelector
    ③Layout
     - Tabを配置し、メインとなるActivity
     - 中身①Activity
     - 中身②Activity
    ④各Layoutに付随するActivity

    ①:タブが選択されている時と、されていない時の絵を用意します。
     ファイルの配置は、drawableの直下とします。

    ②:①で用意した絵の切り替え用のSelectorになります。
    ●tab1.xml
    絵のファイル名を「tab1_normal.png」「tab1_selected.png」とした場合は以下のようになります。
    <?xml version="1.0" encoding="utf-8"?>
    <selector
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
    android:state_selected="true"
    android:state_pressed="false"
    android:drawable="@drawable/tab1_selected" />
    <item android:drawable="@drawable/tab1_normal" />
    </selector>


    ●tab2.xml
    絵のファイル名を「tab2_normal.png」「tab2_selected.png」とした場合は以下のようになります。
    <?xml version="1.0" encoding="utf-8"?>
    <selector
    xmlns:android="http://schemas.android.com/apk/res/android">
    <item
    android:state_selected="true"
    android:state_pressed="false"
    android:drawable="@drawable/tab2_selected" />
    <item android:drawable="@drawable/tab2_normal" />
    </selector>


    ③Layoutを作成します。
     ●Tab自体を配置するメインActivity
     
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout android:id="@+id/layout_root"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:background="#FFFFFF"
    android:orientation="vertical">
    <TabHost
    android:id="@android:id/tabhost"
    android:background="#FFFFFF"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">
    <LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#FFFFFF"
    android:padding="1dp">
    <TabWidget
    android:id="@android:id/tabs"
    android:layout_width="fill_parent"
    android:background="#FFFFFF"
    android:layout_height="wrap_content"/>
    <FrameLayout
    android:id="@android:id/tabcontent"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#FFFFFF"
    android:padding="1dp"/>
    </LinearLayout>
    </TabHost>
    </LinearLayout>


     ●切り替わる中身1
      お好みのLayoutを用意
     ●切り替わる中身2
      お好みのLayoutを用意
    ④各Layoutに付随するActivityを用意
     こちらもタブを配置するメインのActivityのみを記載します。
     切り替わるLayoutに付随のActivityはお好みでどうぞ。
     

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_tab);
    Resources res = getResources();
    TabHost tabHost = getTabHost();
    TabHost.TabSpec spec;
    // Tab1
    intent = new Intent().setClass(this, AActivity.class);
    spec = tabHost.newTabSpec("TAB1")
    .setIndicator("tab1", res.getDrawable(R.drawable.tab1))
    .setContent(intent);
    tabHost.addTab(spec);

    // Tab2
    intent = new Intent().setClass(this, BActivity.class);
    spec = tabHost.newTabSpec("TAB2")
    .setIndicator("tab2" , res.getDrawable(R.drawable.tab2))
    .setContent(intent);
    tabHost.addTab(spec);

    // Set Default Tab - zero based index
    tabHost.setCurrentTab(0);
    } 


    これで大体完成です!
    好きなだけタブつけちゃってください!
    では!

    Category: 開発日記(Java)

    Tag: Java  タブ  Android   
    tb 0 : cm 0   

    【Java】ツリー構造のListViewみたいなものを作成してみた_続き 

    今週も花金がやってきましたね!大坂です。
    花金とか死語ですか?そうですか?そうですね。

    では先週書いたツリー構造のListViewの続きで、チェックボックスの値の取得(?)方法について。

    簡単に言ってしまうと、チェックボックスをクリックするたびに
    「SparseBooleanArray」のデータ入れ替えるだけなんですけども。

    前回コードを基本に抜粋して説明していきます。

    クラス変数に「SparseBooleanArray」とキーに使う「int」変数を準備し、
    チェックボックス作成後、「ID」と「SparseBooleanArray」に
    「false」を設定(チェック入りが初期値の場合、「true」を設定)
    では、コードです。
     // フィールド変数
    SparseBooleanArray checkboxArray = new SparseBooleanArray();
    int childCheckId = 0;

    public void setGropuView(String group, String[] groupChild) {
    /** 省略 */

    // チェックボックスの作成
    final CheckBox childCheck = new CheckBox(this);
    // IDの設定
     childCheck.setId(childCheckId);
    // SparseBooleanArrayにfalseを設定
    checkboxArray.put(childCheckId, false);
    // 次のループ用に「childCheckId」をインクリメント
    childCheckId++
    }

    これでループ毎にそれぞれのチェックボックスに紐づいた「SparseBooleanArray」が作成できますね。
    あとはチェックボックスをクリックしたときに値を入れかていってあげるだけですね。
     // チェックボックスのクリック処理
    childCheck.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    // チェックが入っているとき
    if(childCheck.isChecked()) {
    // チェックを外す
    childCheck.setChecked(false);
    // 「SparseBooleanArray」をfalseに設定
    checkboxArray.put(childCheck.getId(), false);
    // チェックが入っていないとき
    } else {
    // チェックをいれる
    childCheck.setChecked(true);
    // 「SparseBooleanArray」をtrueに設定
    checkboxArray.put(childCheck.getId(), true);
    }
    }
    });

    チェックボックスのIDをキーとしているのでこんな感じで設定できますね。
    あとは今回でいえば「0」からキーを設定しているので順番に取得していくだけです。
    こんなコードはいらないと思いますが。。。
      for(int i = 0; i < checkboxArray.size(); i++) {
    Log.d("checkboxArray_" + i, "" +checkboxArray.get(20000 + i));
    }


    以上で、前回の記事で作成したなんちゃってツリーListViewから
    チェックボックスの値も取得できるようになります。

    「もっといい方法があるよ!」や「なんだか全然わからないけど!」という方がいたらどんどん連絡くださいね!

    ではでは、また来週(´・ω・)ノシ

    Category: 開発日記(Java)

    Thread: 日記

    Janre: 日記

    tb 0 : cm 0   

    【Java】ツリー構造のListViewみたいなものを作成してみた 

    はい。こんにちは。大坂です。

    微妙なタイトルの記事ですが、お付き合いください。

    皆さんはアプリを作成していてこんなもの(↓)をほしくなったりしませんかね?

    グループ1、グループ2をタップ
    ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

    こんな感じの大項目をタップすると小項目が閉じるやつです!(ほしくないですか!?)

    ちょっと調べてみると、「ExpandableListView」というのがありますね!ktkr!・・・ほうほう、よくわからん!(ぇ

    ということでなんちゃってで作ってみました。
    まずはレイアウトからですね。
      <ScrollView
    android:id="@+id/foldScroll"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fadingEdge="none">
    <LinearLayout
    android:id="@+id/foldLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    </LinearLayout>
    </ScrollView>

    「ScrollView」に「LinearLayout」を入れてるだけですね。
    あとはプログラムでどうにかします。
    長いし、よくわからないプログラムかもしれませんが・・・。
    public class HogeActivity extends Activity {
    // 小項目の表示非表示フラグ
    boolean showFlg = false;

    /****** onCreateとかいろいろ省略 ******/

    // ツリー構造を作成するのを呼び出すサンプル。onCreateから呼び出していることにします。
    // (本来はデータ準備してループでやるんですかね?)
    public void hogehoge() {
    String[] group = {"グループ1","グループ2","グループ3"};
    String[] groupChild_1 = {"グループ1_こども1","グループ1_こども2",
    "グループ1_こども3","グループ1_こども4","グループ1_こども5"}
    String[] groupChild_2 = {"グループ2_こども1"}
    String[] groupChild_3 = {"グループ3_こども1","グループ3_こども2",
    "グループ3_こども3"}

    setGropuView(group[0], groupChild_1);
    setGropuView(group[1], groupChild_2);
    setGropuView(group[2], groupChild_3);
    }

    public void setGropuView(String group, String[] groupChild) {
    // 大項目のグループ作成
    TextView groupText = new TextView(this);
    groupText.setText(group + "(" + groupChild.length + ")");
    groupText.setTextSize(24); // テキストサイズ
    groupText.setTextColor(Color.WHITE); // テキスト色
    groupText.setGravity(Gravity.CENTER_VERTICAL); // レイアウト位置(縦真ん中に設定)
    groupText.setLayoutParams(new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.MATCH_PARENT,
    LinearLayout.LayoutParams.WRAP_CONTENT)); // レイアウトのサイズを設定

    // 子供の表示非表示を制御するレイアウトの作成
    final LinearLayout showLayout = new LinearLayout(this);
    showLayout.setLayoutParams(new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.MATCH_PARENT,
    LinearLayout.LayoutParams.WRAP_CONTENT)); // レイアウトのサイズを設定
    showLayout.setOrientation(LinearLayout.VERTICAL); // LinearLayoutで縦設定

    // 大項目をクリックしたときの設定
    groupText.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    // クリックしたとき表示されている場合
    if(showFlg) {
    // 子供の表示非表示を制御するレイアウトを非表示にする
    showLayout.setVisibility(View.GONE);
    // フラグをfalseに設定
    showFlg = false;
    } else {
    // 子供の表示非表示を制御するレイアウトを表示する
    showLayout.setVisibility(View.VISIBLE);
    // フラグをtrueに設定
    showFlg = true;
    }
    }
    });

    // グループのこどもを作成
    // String配列を順番に取り出して処理する
    for(String tmpChild : groupChild) {
    // 今回はチェックボックスも付けているのでさらに「LinearLayout」を作成
    LinearLayout childLayout = new LinearLayout(this);
    childLayout.setLayoutParams(new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.MATCH_PARENT,
    LinearLayout.LayoutParams.WRAP_CONTENT)); // レイアウトのサイズを設定
    childLayout.setOrientation(LinearLayout.HORIZONTAL); // LinearLayoutで横設定

    // こどものテキストを作成
    TextView childText = new TextView(this);
    childText.setText(" " + tmpChild); // テキストに文字を設定
    childText.setTextSize(20); // 文字サイズの設定
    childText.setTextColor(Color.WHITE); // 文字色の設定
    childText.setGravity(Gravity.CENTER_VERTICAL); // レイアウト位置(縦真ん中に設定)
    // レイアウトのサイズを設定「LinearLayout」の中での比率も指定
    childText.setLayoutParams(new LinearLayout.LayoutParams(
    0, LinearLayout.LayoutParams.MATCH_PARENT, 9));
    // チェックボックスの作成
    final CheckBox childCheck = new CheckBox(this);
    // // レイアウト位置(縦真ん中、右寄せに設定)
    childCheck.setGravity(Gravity.CENTER_VERTICAL|Gravity.RIGHT);
    // レイアウトのサイズを設定「LinearLayout」の中での比率も指定
    childCheck.setLayoutParams(new LinearLayout.LayoutParams(
    0, LinearLayout.LayoutParams.MATCH_PARENT, 1));

    // おまけ。
    //テキストをクリックしても対応するチェックボックスにチェックが入るように設定
    childText.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    // チェックが入っているとき
    if(childCheck.isChecked()) {
    // チェックを外す
    childCheck.setChecked(false);
    // チェックが外れているとき
    } else {
    // チェックを入れる
    childCheck.setChecked(true);
    }
    }
    });

    // 横並びのLinearLayoutにテキストとチェックボックスを追加
    childLayout.addView(childText);
    childLayout.addView(childCheck);
    // 子供の表示非表示を制御するLinearLayoutに横並びのLinearLayoutを追加
    showLayout.addView(childLayout);
    }
    // レイアウトファイルに設定しているLinearLayoutに大項目のテキストを設定
    foldLayout.addView(groupText);

    // 親Viewを取得してremoveView実行(エラー対策)
    ViewGroup parent = (ViewGroup)showLayout.getParent();
    if ( parent != null ) {
    parent.removeView(showLayout);
    }
    // レイアウトファイルに設定しているLinearLayoutに
    // 子供の表示非表示を制御するLinearLayoutを追加
    foldLayout.addView(showLayout);
    }
    }

    こんな感じでやってみました。一応これで張り付けた画面のようなものができます!
    本当はバックグラウンドや間の線も指定していますが、省略しています。
    チェックボックス付でもっといいやり方ご存知の方!是非是非、教えてください!

    あとはチェックボックスの値を取っていろいろやれば完成ですね・・・。
    ではで・・・え?チェックボックスの処理はないのかって??
    えぇ!まだ作ってません!ごめんなさいorz

    来週の記事で書けるようにするので許してくださいm(_ _)m

    ではでは、また来週(´・ω・)ノシ

    Category: 開発日記(Java)

    Thread: 日記

    Janre: 日記

    tb 0 : cm 0   

    【Java】ツイッター連動について 

    こんにちは。大坂です。

    酒めもりのチラシを作って横浜にある海華月さんにおいてもらいました!
    是非、お店に行って楽しく美味しい料理・お酒を飲みながら確認してみてください!!
    チラシはこんな感じですよ~。
    sakememory.png

    では、今週のプログラムの話題に。作成したアンドロイドアプリでツイッターに連動したい場合についてです。
    方法は以下があります。(ほかにもあれば教えてください!)
    ・Twitter4jを利用する方法
    ・暗黙のIntentを利用する方法
    ・URLを使用する方法(画像が送れない?)
    今回は暗黙のIntentを利用し、ツイート文言と画像を送る方法。
       //Intent.ACTION_SENDを発行
    Intent intent = new Intent(Intent.ACTION_SEND);
    // 画像も送りたいので「image/jpeg」を指定
    intent.setType("image/jpeg");
    // ツイート文言の設定
    intent.putExtra(Intent.EXTRA_TEXT, "お酒おいしい。");
    // 画像の設定(content://でファイルを指定する)
     intent.putExtra(Intent.EXTRA_STREAM,
    Uri.parse("content://media/external/images/media/1"));
    // 呼び出し 10はリクエストID(アプリ内でわかりやすいものを指定すればよい)
    startActivityForResult(intent, 10);

    こんな感じです。が、しかしTwitter以外のアプリを選ばれるとうまくいかないこともありますね。
    FaceBookとかは「Intent.EXTRA_TEXT」がURLようになっているみたいですし。
    Twitter公式アプリのみを対象とするなら、
     intent.setClassName("com.twitter.android", "com.twitter.android.PostActivity");

    をIntentに設定すれば、直接Twitter公式アプリが起動されます。
    Twitter公式アプリがない場合は「ActivityNotFoundException」が発生するので、Catchして処理をするか事前にTwitter公式アプリがインストールをされているか確認しましょう。
    確認方法はこんな感じでしょうか。
      boolean twitterFlg = false;
    // パッケージマネージャを取得
    PackageManager pm = getPackageManager();
    // ランチャーから起動出来るアプリケーションの一覧を取得
    Intent intent = new Intent(Intent.ACTION_MAIN, null);
    intent.addCategory(Intent.CATEGORY_LAUNCHER);
    // 一覧の取得
    List list = pm.queryIntentActivities(intent, 0);
    if (list != null) {
    for (ResolveInfo info : list) {
    // アプリ名をログに出力
    Log.i("アプリ名", info.loadLabel(pm).toString());
    // パッケージ名をログに出力
    Log.i("パッケージ名", info.activityInfo.packageName);
    // パッケージ名に「"com.twitter.android"」が存在するか判定
    if(info.activityInfo.packageName.equals("com.twitter.android")) {
    twitterFlg = true;
    break;
    }
    }
    }

    ここまで書いたことをうまく利用すれば、認証とかをあまり気にせずにTwitter連動ができるのではないでしょうか。
    Twitter4Jの記事も探すと色々あるので自分やアプリに合った方法でツイッター連動してみましょう!

    ではでは、また来週(´・ω・)ノシ

    Category: 開発日記(Java)

    tb 0 : cm 0