Android アプリ開発 「MATRIX」

Androidアプリの開発に役立つサンプル集



他のクラスの変数を参照して変更する方法

他のクラスの変数を参照して変更する方法

今回は他のクラスにある変数を直接的に参照して変更する方法を説明します。メインの MainActivity.class から 文字を表示しているオリジナルの View クラス(MyView.class)にある変数「yy」を参照して変更します。 

①サンプルコード(MainActivity.class) 

MainActivity.class では、オリジナル View クラス(MyView.class)をインスタンス化し、それを経由して MyView.class の変数にアクセスします。詳細な説明はコード内のコメントを見てください。

public class MainActivity extends AppCompatActivity {

private MyView myView; // MyView クラスをインスタンス化するための箱
private Timer timer; // Timer クラスをインスタンス化するための箱
private Handler handler; // Handler クラスをインスタンス化するための箱

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

// MyView クラスをインスタンス化して mView に格納
myView = new MyView(getBaseContext());
// myView を渡して表示する
setContentView(myView);

// MyView UI にアクセスするための Handler インスタンス化して handler に格納
handler = new Handler();

// Timer インスタンス化して timer に格納
timer = new Timer();
// timer にスケジュールを設定すると同時に処理内容を記述
timer.schedule(new TimerTask() {

@Override
public void run() {
// myView クラスの変数 yy 3 を加える
myView.yy += 3;
// UI にアクセスする場合は handler を経由する
handler.post(new Runnable() {
@Override
public void run() {
// myView onDraw 処理を更新する
myView.invalidate();
}
});
}
}, 1000, 1000);
}

}

②サンプルコード(MyView.class) 

参照して変更される変数をもっているクラスです。重要ポイントは参照・変更させたい変数のアクセス修飾子を「public」にすることです。※このクラス内では変数「yy」の値を変更していません。 

public class MyView extends View {

// Paint インスタンス化して paint に格納
private Paint paint = new Paint();
// Y 座標の位置 yy 100f を格納
public float yy = 100f;

public MyView(Context context) {
super(context);
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

// paint にテキストサイズ 100f をセット
paint.setTextSize(100f);
// キャンバスに文字を出力する。位置は X=10f, Y=yy。スタイルは paint
canvas.drawText("TEST", 10f, yy, paint);
}

③結果

MainActivity.class から MyView.class の変数「yy」が変更され、一秒ごとに「TEST」という文字が下方に移動します。 

f:id:vw-dsg:20180717005043p:plain

④備考・その他

今回は MyView.class で描画しているので、レイアウトXLMファイルは使用していません。 

END

Android Studio 3.1.3 でデザインのレイアウトが編集できない場合の対処方法

デザインのレイアウトが編集できない

いつものように新規にプロジェクトを作成したにもかかわらず、ある日突然デザインがまったく表示されなくなりレイアウトの編集ができなくなる場合があります。

f:id:vw-dsg:20180715072418p:plain

よく見ると、デザインエリアの右上にある「!」のエラーアイコンが赤く点灯しています。さっそくクリックしてみましょう。

f:id:vw-dsg:20180715073054p:plain

赤い「!」マークをクリックするとエラーの内容が下部に表示されました。翻訳してみるとレンダリングに関係するエラーだというのはわかりましたが、内容が漠然としていていまひとつ理解できません。

対処方法(手順)

f:id:vw-dsg:20180715073714p:plain

以前にも同じようなトラブルがあったのを思い出して、まだコードネームが付けられていない SDKプラットフォーム「Android API 28」のチェックを外してアンインストールしてみます。

f:id:vw-dsg:20180715074741p:plain

Android SDK Platform 28」を削除しますか?と聞かれるので「OK」をクリック。

f:id:vw-dsg:20180715074932p:plain

Android SDK Platform 28」のアンインストールが開始されます。

f:id:vw-dsg:20180715075002p:plain

Android SDK Platform 28」のアンインストールが完了したら「Finish」をクリックして画面を閉じます。

f:id:vw-dsg:20180715075101p:plain

Android SDK Platform 28」をアンインストールした後に、さっそく新規にプロジェクトを作成してみると、今度は正しくデザインのレイアウトが表示され編集も可能になりました。やっぱり原因は「Android SDK Platform 28」にあったようです。

備考・まとめ

今回の、デザインレイアウトが表示されなくなって編集も不可能になるというトラブルは、まだコードネームが付けられていない最新の「SDK Platform」(今回は Android SDK Platform 28)を含めて開発しようとして起きてしまったようです。

最新の SDKプラットフォームは、Android Studio のアップデートを経由してインストールされる可能性があるので、もしアップデート後に今回と似たようなトラブルが起きた場合は「SDKマネージャー」からコードネームのないプラットフォームがインストールされていないかを一度チェックしてみて下さい。

END

音声を認識して結果をテキスト表示する方法(音声認識アプリ)

簡単な音声認識アプリを作る

今回は、グーグルが提供している音声認識システムを使用した簡単な音声認識アプリを作ってみたいと思います。 詳細についてはコード内にコメントで記載してありますので、そちらをご覧ください

サンプルコード①(MainActivity.java) 

ポイントは、音声認識が完了した後の処理をする「onActivityResult」をオーバーライドするところです。これがないと音声認識の結果を受け取ることができませんので、必ず追加してください。 

import android.content.Intent;
import android.speech.RecognizerIntent;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Locale;

public class MainActivity extends AppCompatActivity {

private TextView textView, textView2;
private Button button;
//任意の識別番号
private static final int REQUEST_CODE = 12345;

//アプリが開始されると最初に処理されるメソッド
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

//このアプリで使用するレイアウトファイルをセット
setContentView(R.layout.activity_main);

//画面の上にあるアクションバーを隠す(隠さなくても良い)
ActionBar actionBar = getSupportActionBar();
actionBar.hide();

//レイアウトにある2つのテキストビューを取得
textView = (TextView)findViewById(R.id.textView);
textView2 = (TextView)findViewById(R.id.textView2);

//レイアウトにあるボタンを取得
button = (Button)findViewById(R.id.button);

//上で取得したボタンにクリックイベントを実装
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

//音声認識用のインテントを作成
Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
//認識する言語を指定(この場合は日本語)
intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE, Locale.JAPANESE.toString());
//認識する候補数の指定
intent.putExtra(RecognizerIntent.EXTRA_MAX_RESULTS, 10);
//音声認識時に表示する案内を設定
intent.putExtra(RecognizerIntent.EXTRA_PROMPT, "話してください");
//音声認識を開始
startActivityForResult(intent, REQUEST_CODE);
}
});
}

//音声認識が終わると自動で呼び出されるメソッド
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if(requestCode == REQUEST_CODE && resultCode == RESULT_OK) {

//data から音声認識の結果を取り出す(リスト形式で)
ArrayList<String> kekka = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);

//認識結果が一つ以上ある場合はテキストビューに結果を表示する
if (kekka.size() > 0) {
//一番最初にある認識結果を表示する
textView2.setText(kekka.get(0));
} else {
//何らかの原因で音声認識に失敗した場合はエラーメッセージを表示
textView2.setText("音声の認識に失敗しました…");
}
}
}
}

 

サンプルコード②(activity_main.xml) 

テキストビュー2つとボタンが1つあるだけのレイアウトで、特に注意する点はありません。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp"
tools:context="test.MainActivity">

<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="認識結果"
android:textSize="18sp" />

<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_below="@+id/textView"
android:text="結果"
android:textSize="18sp" />

<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:text="音声認識スタート" />
</RelativeLayout

実行結果 

① 起動直後の画面です。

f:id:vw-dsg:20180327114021p:plain

② 「音声認識スタート」ボタンを押すと音声認識が開始されます。音声認識の小画面にはプログラムコード内で設定した「話してください」という案内が表示されます。

f:id:vw-dsg:20180327114111p:plain

③ 適当な言葉を話しかけると「認識結果」のすぐ下に話しかけた内容が表示されます。

f:id:vw-dsg:20180327114414p:plain

まとめ

音声認識機能はポイントさえ押さえてしまえば意外と簡単に実装できますので、これから音声認識機能を使ったアプリを作ろうと考えている方は、ぜひ今回のサンプルを参考にしてください。 

END