SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

業務アプリ開発に使えるUIが満載、「Xuni(ズーニー)」で作るAndroid/iOSアプリ(AD)

Androidアプリで表計算ソフトのようにデータを表示しよう

業務アプリ開発に使えるUIが満載、「Xuni(ズーニー)」で作るAndroid/iOSアプリ 第1回

  • このエントリーをはてなブックマークに追加

 業務モバイルアプリで求められる、表計算ソフトのようなグリッドやきれいなグラフ表示の実現は、なかなか骨の折れる作業です。モバイルアプリ開発用のコントロールセット「Xuni(ズーニー)」を使用することで、これらを効率的に開発することができます。今回は、グリッドを実現するFlexGridと、グラフ表示が可能なFlexChartを、Androidで試してみます。

  • このエントリーをはてなブックマークに追加

必要な環境

Xuniとは

 Xuniは、業務モバイルアプリによく使われる市販のコントロールセットです。クロスプラットフォーム環境に対応しているので、iOS、Android、Windows Phoneにて使用可能です。Windowsアプリケーション開発者ならば、FlexGridやFlexChartになじみがあるのではないでしょうか。

 2016年1月20日リリースの「2015J v3」において、機能が強化されました。詳細についてはXuni 2015J v3の新機能を参照してください。

こんな依頼無いですか?

 「スマホでも表計算ソフトのように表示したい」「見栄えのよいグラフを表示したい」

 みなさんもこんな依頼を一度は聞いたことがありませんでしょうか?

 筆者は「表計算ソフトのように」という要望は、難易度が高いと考えています。例えば、セルをタッチしたら編集、カラムをタッチしたら並び替え、フィルタなどの機能をAndroid標準のコントロールだけで実装しようとすると、TableLayoutとTextBoxなどを駆使する必要があり、かなり苦労します。

 XuniのFlexGridとFlexChartを使うと、それが簡単に実現できます。自分で実装する時間と手間を考えると、用途に合うコンポーネントを使用したほうが良いでしょう。

Xuniのデモアプリ

 Xuniのコントロールを使用した無料アプリが公開されています。各コントロールがどのように動くか体験してみましょう。

 「2015J v3」の機能が含まれており、iOS、Android、Windows Phoneにて使用可能です。

Xuniのインストール

 Xuniを試すための準備として、まずはMac OS X版をインストールします。本記事では最大30日間試用可能なトライアル版を利用します。

 トライアル版ダウンロードにて、下部にある「Xuni Enterprise」の「ダウンロード」をクリックします。

 フォームに必要な情報を入力すると、インストーラーのダウンロードURLがメールにて送付されます。リンクをクリックするとpkgがダウンロードされます。

 ダウンロードしたpkgをfinderでダブルクリックしてインストールします。

FlexGridのサンプルプロジェクトを動かしてみよう

 Xuniをインストールするとサンプルプログラムが下記の場所に保存されます。

~/Documents/XuniJp/Android/Samples

 早速FlexGridのサンプルを動かしてみましょう。

Android Studioからプロジェクトを開く

 Android Studioを立ち上げて、「Open an existing Android Studio project」を選択します。

 FlexGridのサンプルが保存されている下記場所を選択して「choose」を選択します。

~/Documents/XuniJp/Android/Samples/AndroidStudio/FlexGrid101

 gradleのビルドが行われて、このようにAndroid Studioが立ち上がります。

アプリを実行する

 早速実行してみましょう。実行方法は次のボタンをクリックします。

 どの端末で実行するか選択します。今回はNexus 5のエミュレーターで実行します。

 FlexGridのサンプルアプリが起動しました。

アプリで何ができるか見てみよう

 シンプルな「列の定義」を選択します。

 表計算風な画面にID、名前、注文金額などが表示されます。

 スワイプでスクロール、タップで選択、ダブルタップで編集ができます。

アプリがどのように実装されているか見てみよう

 どのように実装されているかコードを見てみましょう。

 「列の定義」にて使用されているコードは2つです。activity_column_definitions.xmlにてFlexGridのViewを定義し、カラムの設定をColumnDefinitionsActivity.javaにて行っています。

 ColumnDefinitionsActivity.javaにてどのようにカラムを設定しているかを詳しく見てみましょう。

public class ColumnDefinitionsActivity extends Activity
{
	private FlexGrid mGrid;

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

		setContentView(R.layout.activity_column_definitions);

		//(1)
                // initializing grid
		mGrid = (FlexGrid) findViewById(R.id.flexgrid);

		// auto column generation disabled in activity_column_definitions.xml
		// mGrid.setAutoGenerateColumns(false);

		//(2)
		mGrid.setItemsSource(Customer.getList(100));

		//(3)
		// initialize new columns
		GridColumn idColumn = new GridColumn(mGrid, "Id", "id");
		idColumn.setReadOnly(true); //(4)

		GridColumn firstNameColumn = new GridColumn(mGrid, "First Name", "firstName");
		GridColumn lastNameColumn = new GridColumn(mGrid, "Last Name", "lastName");

		GridColumn orderTotalColumn = new GridColumn(mGrid, "Order Total", "orderTotal");
		orderTotalColumn.setFormat("$#.##"); //(5)

		GridColumn countryColumn = new GridColumn(mGrid, "Country", "countryId");
		countryColumn.setDataMap(new GridDataMap(Customer.getCounties(), "countryId", "countryName"));
		countryColumn.setShowDropDown(true); //(6)

		GridColumn lastOrderDateColumn = new GridColumn(mGrid, "Last Order Time", "lastOrderDate");
		lastOrderDateColumn.setFormat("hh:mm a");

		GridColumn activeColumn = new GridColumn(mGrid, "Active", "active");
		activeColumn.setDataType(DataType.BOOLEAN); //(7)

		//(8)
		// add new columns
		mGrid.getColumns().add(idColumn);
		mGrid.getColumns().add(firstNameColumn);
		mGrid.getColumns().add(lastNameColumn);
		mGrid.getColumns().add(orderTotalColumn);
		mGrid.getColumns().add(countryColumn);
		mGrid.getColumns().add(lastOrderDateColumn);
		mGrid.getColumns().add(activeColumn);

		//(9)
		mGrid.setCellFactory(new TimeEditorCellFactory(mGrid));
	}

	@Override
	protected void onStart()
	{
		super.onStart();

		//(10)
		// auto resize all the columns so that the text from each row is analyzed and sets the
		// column width to the highest text width.
		mGrid.autoSizeColumns(0, mGrid.getColumns().size() - 1);
	}
}
  1. FlexGridを初期化する。
  2. setItemsSourceメソッドはFlexGridに表示するデータのデータソースを設定する。
  3. 表示に必要な数の列(GridColumnクラス)を作成して、列名と先ほど設定したデータの項目名をバインドする。
  4. setReadOnlyメソッドで編集不可にできる。
  5. setFormatメソッドでデータを表示する書式("$#.##")で「$1.99」を設定する。
  6. setShowDropDownメソッドでドロップダウンリストの使用を設定する。
  7. setDataTypeメソッドで項目"Active"の列をチェックボックス型に設定する。
  8. FlexGridに作成した列を追加する。
  9. 数値の項目を編集する際にAndroidのタイムピッカーダイアログを表示する。セル編集のカスタマイズにはCellFactory機能を利用する。
  10. 列のサイズをテキストの長さに応じて自動調整する。
タイムピッカーダイアログ
タイムピッカーダイアログ

FlexChartのサンプルプロジェクトを動かしてみよう

 今度はFlexChartを動かしてみましょう。グラフの表示も要望が大変多い機能だと思います。

プロジェクトを開く

 FlexGridの時と同じように、Android StudioにてFlexChartのサンプルプロジェクトを開きます。

~/Documents/XuniJp/Android/Samples/AndroidStudio/FlexChart101

アプリを実行する

 こちらもFlexGridと同じ要領で実行します。今回は「FlexChartの基本機能」をタップします。

アプリで何ができるか見てみよう

 FlexGridの「FlexChartの基本機能」を表示したのが次の画面です。きれいな棒グラフが表示されています。

 棒グラフをタップすると詳細が表示されます。

アプリがどのように実装されているか見てみよう

 FlexGridと同じように使用できます。

 activity_getting_started.xmlとGettingStartedActivity.javaの2つのファイルで構成されています。

 GettingStartedActivity.javaにてチャートの設定を行います。使い方もFlexGridと同じ感覚で使えます。

public class GettingStartedActivity extends Activity
{

	private FlexChart mChart;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		//(1)
                // setting the dark theme
		// FlexChart automatically adjusts to the current theme
		setTheme(android.R.style.Theme_Holo);

		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_getting_started);

                //(2)
		// initializing widget
		mChart = (FlexChart) findViewById(R.id.flexchart);

		//(3)
		// set the binding for X-axis of FlexChart
		mChart.setBindingX("name");

		//(4)
		// initialize series elements and set the binding to variables of
		// ChartPoint
		ChartSeries seriesSales = new ChartSeries(mChart, "Sales", "sales");
		ChartSeries seriesExpenses = new ChartSeries(mChart, "Expenses", "expenses");
		ChartSeries seriesDownloads = new ChartSeries(mChart, "Downloads", "downloads");

		//(5)
		// add series to list
		mChart.getSeries().add(seriesSales);
		mChart.getSeries().add(seriesExpenses);
		mChart.getSeries().add(seriesDownloads);

		//(6)
		// setting the source of data/items in FlexChart
		mChart.setItemsSource(ChartPoint.getList());

		// mChart.getAxisX().setOrigin(Float.valueOf((float) 4.0));
		// mChart.getAxisY().setOrigin(Float.valueOf((float) -20000.0));
	}
}
  1. アプリのテーマを設定するとFlexChartは自動的にあわせる。
  2. FlexChartを初期化する。
  3. FlexChartのX軸に表示するデータをnameを設定する。
  4. ChartSeriesをグラフの系列ごと(Sales、Expenses、Download)に作成する。
  5. 作成した系列をFlexChartに追加する。
  6. ChartPointクラスで作成したデータクラスを、FlexChartのItemsSourceに設定する。

表示するデータを変更してみよう

 このFlexChartのサンプルは、ChartPointクラスでダミーデータを作成して表示しています。このクラスを変更してグラフに表示するデータを変更してみます。

 前述のコードでitemSourceを設定している部分(6)を見ると、ChaetPoint.getList メソッドで取得していることがわかるので、ChartPoint.javaをエディタに表示します。

 getListメソッドの、数値をランダムに設定している部分のコードを、2番目の数値のみマイナス値になるように変更します。

public static ObservableList<ChartPoint> getList()
{
    ObservableList<ChartPoint> list = new ObservableList<ChartPoint>();

    int n = 6; // number of series elements
    String[] countries =
    { "US", "Germany", "UK", "Japan", "Italy", "Greece", "India", "Canada" };
    Random random = new Random();

    for (int i = 0; i < n; i++)
    {
        list.add(new ChartPoint(countries[i], random.nextInt(20000), random.nextInt(20000), ra.nextInt(2000)));
    }
    return list;
}
変更後のコード
        list.add(new ChartPoint(countries[i], random.nextInt(20000), random.nextInt(20000)*-1, random.nextInt(2000)));

 FlexChartに変更を加えることなく、マイナス値を表示するグラフが表示できました。

まとめ

 このように基本的な表示や操作はXuniに用意されています。Xuniは自分で一から実装する手間を省いて、開発する時間を大幅に削減することが出来ます。基本的な表示や操作はXuniに任せて、より重要な業務ロジックの実装について注力することが可能になります。

 XuniのサンプルにおいてUIは日本語化されていますがデータは英語です。設定を変更したり、データを日本語にするなど、皆様ご自身で色々試してみることをおすすめします。

 次回は、今回紹介しきれなかった、データのフィルタ処理やグループ化ができるCollectionViewや、アニメーション表示などについてご紹介します。

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/9187 2016/01/22 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング