ソース掲示板




すべてから検索

キーワード   条件 表示 現行ログ 過去ログ トピックス 名前 本文
Android : Data Binding における include を使用した画面分割( ソースコード )
日時: 2015/10/26 14:14
名前: lightbox



activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:bind="http://schemas.android.com/apk/res-auto"
        tools:context=".MainActivity">

    <data>
        <variable
            name="user"
            type="sample.lightbox.androidbind1017.Syain"/>
    </data>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/scrollView">

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:paddingTop="@dimen/activity_vertical_margin"
            android:paddingBottom="@dimen/activity_vertical_margin">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="1dp"
                android:id="@+id/topText"
                android:focusable="true"
                android:focusableInTouchMode="true"/>

            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/action">

                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="SET"
                    android:id="@+id/button"
                    android:layout_alignParentEnd="true"
                    android:layout_weight="1"/>

                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="GET"
                    android:layout_weight="1"
                    android:id="@+id/button3"/>

                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="JS CALL"
                    android:id="@+id/button2"
                    android:layout_weight="1"/>
            </LinearLayout>

            <LinearLayout
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:id="@+id/dataBody">

                <EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@{user.scode}"
                    android:inputType="number"
                    android:id="@+id/editText"
                    android:background="@drawable/border"
                    android:padding="5dp"/>

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="@{user.kj}"
                    android:textAppearance="?android:attr/textAppearanceLarge"
                    android:id="@+id/textView"
                    android:layout_margin="4dp"
                    android:focusable="true"
                    android:focusableInTouchMode="true"/>

                <TextView
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:textAppearance="?android:attr/textAppearanceLarge"
                    android:text="@{user.furi}"
                    android:id="@+id/textView2"
                    android:layout_margin="4dp"/>

            </LinearLayout>

            <include
                layout="@layout/ex_contents"
                android:id="@+id/ex"
                bind:user="@{user}"/>

            <sample.lightbox.androidbind1017.DataWebView
                android:layout_width="match_parent"
                android:layout_height="300dp"
                android:id="@+id/webView"
                android:visibility="invisible"/>

        </LinearLayout>
    </ScrollView>
</layout>
xmlns:bind="http://schemas.android.com/apk/res-auto" は無くても動作しましたが、Android Studio に『必要無い』といわれたのは第三画面だけでした

ネームスペースはルートの要素にのみ必要です
tools:context=".MainActivity" は画面デザイン時に必要のようです
入力フィールドの背景用罫線の定義
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <stroke
        android:color="@android:color/black"
        android:width="1dp" />
    <corners android:radius="6dp" />
</shape>
メンテナンス

ex_contents.xml ( No.1 )
日時: 2015/10/26 15:33
名前: lightbox


日時: 2015/10/26 15:33
名前: lightbox
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:bind="http://schemas.android.com/apk/res-auto"
        tools:context=".MainActivity">

    <data>
        <variable
            name="user"
            type="sample.lightbox.androidbind1017.Syain"/>
    </data>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{user.syozoku}"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:id="@+id/textView3"
            android:layout_margin="4dp"/>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{user.sname}"
            android:textAppearance="?android:attr/textAppearanceLarge"
            android:id="@+id/textView4"
            android:layout_margin="4dp"/>

        <NumberPicker
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/numberPicker"/>

        <Spinner
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/spinner"
            android:spinnerMode="dropdown"/>

        <DatePicker
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/datePicker"
            android:datePickerMode="spinner"/>

        <include
            layout="@layout/ex_contents2"
            android:id="@+id/ex2"
            bind:user="@{user}"/>

    </LinearLayout>
</layout>
android:datePickerMode"spinner" は、年月日を全て上下スクロールで選択する為に必要です
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
ex_contents2.xml ( No.2 )
日時: 2015/10/26 10:20
名前: lightbox
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        tools:context=".MainActivity">

    <data>
        <variable
            name="user"
            type="sample.lightbox.androidbind1017.Syain"/>
    </data>

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <EditText
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{user.kj}"
            android:id="@+id/editText2"
            android:background="@drawable/border"
            android:padding="5dp"/>

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="TOP"
            android:id="@+id/button4"/>

    </LinearLayout>
</layout>
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
Syain クラス( Data Binding と Google Gson 兼用 ) ( No.3 )
日時: 2015/10/28 01:06
名前: lightbox
package sample.lightbox.androidbind1017;

import android.databinding.BaseObservable;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.DatePicker;
import android.widget.NumberPicker;
import android.widget.Spinner;

import java.util.Arrays;

public class Syain extends BaseObservable {

	// シリアライズ・デシリアライズをしない( static )
	static public MainActivity context = null;
	// NumberPicker 用
	static public NumberPicker np = null;
	static public String[] nums = {"男性","女性","不明"};
	static public int[] values = {-10,20,100};
	// Spinner 用
	static public Spinner sp = null;
	// DatePicker 用
	static public DatePicker dp = null;

	public String scode;
	public String kj;
	public String furi;
	public String syozoku;
	public String seibetu;
	public String kyuyo;
	public String teate;
	public String kanri;
	public String birth;
	public String sname;

	public Syain() {
		this.scode = "";
		this.kj = "初期状態";
		this.furi = "";
		this.syozoku = "";
		this.seibetu = "";
		this.kyuyo = "";
		this.teate = "";
		this.kanri = "";
		this.birth = "";
		this.sname = "";
	}

	// ******************************************
	// NumberPicker 用
	// ******************************************
	public void setupSeibetuControl() {
		np.setMinValue(0);
		np.setMaxValue(2);
		np.setDisplayedValues(nums);
		np.setValue(1);

	}
	public void setSeibetuControl(String seibetu) {
		if ( seibetu != null ) {
			this.seibetu = seibetu;
		}
		np.setValue(Integer.parseInt(this.seibetu));
	}
	public void getSeibetuControl() {
		this.seibetu = Integer.toString(np.getValue());
	}

	// ******************************************
	// Spinner 用
	// ******************************************
	public void setupSyozokuControl(String[] list_data) {
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(
				context,
				android.R.layout.simple_spinner_item);
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		adapter.addAll(list_data);
		sp.setAdapter(adapter);
	}
	public void setSyozokuControl(String syozoku,String[] list_value) {
		if ( syozoku != null ) {
			this.syozoku = syozoku;
		}
		int idx = Arrays.binarySearch(list_value,this.syozoku);
		sp.setSelection(idx);
	}
	public void getSyozokuControl(String[] list_value) {
		int idx = sp.getSelectedItemPosition();
		this.syozoku = list_value[idx];
	}

	// ******************************************
	// DatePicker 用
	// ******************************************
	public void setupBirthControl(Boolean spinners, Boolean calendar) {
		dp.setSpinnersShown(spinners);
		dp.setCalendarViewShown(calendar);
	}
	public void setBirthControl(String birth) {
		if ( birth != null ) {
			this.birth = birth;
		}
		if ( this.birth != null ) {
			String dt[] = this.birth.split("-");
			if ( dt.length == 3 ) {
				dp.updateDate(Integer.parseInt(dt[0]), Integer.parseInt(dt[1])-1, Integer.parseInt(dt[2]));
			}
		}
	}
	public void getBirthControl() {
		this.birth = String.format("%d/%d/%d",dp.getYear(),dp.getMonth()+1,dp.getDayOfMonth());
	}


}
対応する JSON
{
    "scode": "0001",
    "kj": "浦岡 友也",
    "furi": "ウラオカ トモヤ",
    "syozoku": "0003",
    "seibetu": "0",
    "kyuyo": "270000",
    "teate": "9000",
    "kanri": null,
    "birth": "2000-10-01",
    "sname": "営業部第三"
}
▼ サンプル URL http://winofsql.jp/dbdata2_json.php?scode=0001
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
dbdata2_json.php のソースコード ( No.4 )
日時: 2015/10/26 15:54
名前: lightbox
<?php
header( "Content-Type: application/json; Charset=utf-8" );
header( "pragma: no-cache" );
header( "Expires: Wed, 31 May 2000 14:59:58 GMT" );
header( "Cache-control: no-cache" );
header( "Access-Control-Allow-Origin: *" );

$server = 'サーバー';
$db_name = 'データベース';
$user = 'ユーザ';
$password = 'パスワード';

$json_type =  JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT;
$db_data_type = MYSQLI_ASSOC;

// 接続
$connect = new mysqli($server, $user, $password, $db_name);
if ($connect->connect_error) {
	die('Connect Error (' . $connect->connect_errno . ') '
	. $connect->connect_error);
}
$connect->set_charset("utf8"); 

$_GET["scode"] = str_replace("'","''",$_GET["scode"]);

$query = <<< QUERY
select 

社員コード as scode,
氏名 as kj,
フリガナ as furi,
所属 as syozoku,
性別 as seibetu,
給与 as kyuyo,
手当 as teate,
管理者 as kanri,
生年月日 as birth,

コード名称マスタ.名称 as sname
from 社員マスタ
left outer join コード名称マスタ

on 社員マスタ.所属 = コード名称マスタ.コード

where コード名称マスタ.区分 = 2	
and 社員コード = '{$_GET["scode"]}'
QUERY;

// クエリ
$result = $connect->query($query); 
if ( !$result ) {
	die('クエリーに誤りがあります : ' . $connect->error );
}

$check = false;
while ($row = $result->fetch_array($db_data_type)) {

	$check = true;
	print json_encode($row,JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT);
	print "\n";

}

// 開放
$result->close();
// 接続解除
$connect->close();

if (!$check) {
	print <<< ERROR
{
    "scode": "{$_GET["scode"]}",
    "kj": "ERROR",
    "furi": null,
    "syozoku": null,
    "seibetu": null,
    "kyuyo": null,
    "teate": null,
    "kanri": null,
    "birth": null,
    "sname": null
}
ERROR;
}

?>
このアーティクルの参照用URLをクリップボードにコピー メンテナンス
002.php ( WebView に表示して、dbdata2_json.php を呼び出して Android に返します ) ( No.5 )
日時: 2015/10/26 15:57
名前: lightbox
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<script src="//ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script>
function getWebPageData(scode) {
	// ***************************************
	// Android WebView の中のこのページ
	// より、サーバへアクセスします
	// ***************************************
	$.get("dbdata2_json.php?scode="+scode,function( data ){
		if ( typeof androidObject !== 'undefined' ) {
			// サーバから受け取った application/json データ
			// を文字列に変換して Android に渡します
			androidObject.toAndroid(JSON.stringify(data));
		}
		else {
			// 通常のブラウザではこちらが実行されます
			console.log(JSON.stringify(data,null,"   "));
		}
	})
}
</script>
</head>
<body>
<pre>
<?php
// Android の呼び出しテスト
?>
<input type="button" value="logcat test" onclick="androidObject.logcat('OK')">

<?php
// サーバからのデータで Android の呼び出しテスト
?>
<input type="button" value="toAndroid test" onclick="getWebPageData('0001')">

<a href="dbdata2_json.php?scode=0001">リンク</a>

</pre>
</body>
</html>
このアーティクルの参照用URLをクリップボードにコピー メンテナンス