新規プロジェクト作成
状態:確認中
閲覧数:1,399
投稿日:2018-02-24
更新日:2018-03-12
Android Studio を起動
・[File] > [New] > [New Project] をクリック
[Application name]、[Company domain]、[Project location]を入力し、[Next]をクリック
・※パッケージ名は変更できるが、特に問題なければそのままでよい
[mimimum SDK]は[API 27](現在の最新)を選択
[Next]をクリック
エミュレータの動作確認が目的なので、ここでは[Empty Activity]を選択し、[Next]をクリック
そのまま[Next]をクリック
[Component Installer]画面で、[Done] が表示されたら、[Finish]をクリック
・「アクセスを許可する」ボタンをクリック
メニューの[Run]->[Run App]をクリックして実行
最新の「API 27」しか入れてないので、[Nexus 5X API 27 x86]を選択して[OK]をクリック
▼MainActivity.java
▼AndroidManifest.xml
・[File] > [New] > [New Project] をクリック
過去にプロジェクトを開いていない場合、Android Studio にオープニング画面が表示されます。新規プロジェクトを作成するには、[Start a New Android Studio project] をクリックします。
プロジェクトを開いたことがある場合は、Android Studio に開発環境が表示されます。新規プロジェクトを作成するには、[File] > [New] > [New Project] をクリックします。
・プロジェクトの作成プロジェクトを開いたことがある場合は、Android Studio に開発環境が表示されます。新規プロジェクトを作成するには、[File] > [New] > [New Project] をクリックします。
[Application name]、[Company domain]、[Project location]を入力し、[Next]をクリック
・※パッケージ名は変更できるが、特に問題なければそのままでよい
項目 | 内容 |
---|---|
Application name: | App 20180302 |
Company domain: | android0.w4c.work |
Project location: | L:\Android\AndroidStudioProject\App20180302 |
Package name: | tokyo.w3c.android0.app20180302 |
[Next]をクリック
エミュレータの動作確認が目的なので、ここでは[Empty Activity]を選択し、[Next]をクリック
そのまま[Next]をクリック
[Component Installer]画面で、[Done] が表示されたら、[Finish]をクリック
・「アクセスを許可する」ボタンをクリック
エミュレータで実行
メニューの[Run]->[Run App]をクリックして実行
最新の「API 27」しか入れてないので、[Nexus 5X API 27 x86]を選択して[OK]をクリック
▼MainActivity.java
package tokyo.w3c.android0.app20180302;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
▼AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="tokyo.w3c.android0.app20180302">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Pixel Launcher has stopped
P105.MainActivityクラスについて / 2.2 アプリケーションの基本を覚える
Androidアプリの最もシンプルなソースコード
Activityクラス
・Androidアプリの最も基本となるクラス
MainActivityクラス
・android.support.v7.appパッケージの「AppCompatActivity」クラスを継承して作成されている
onCreateメソッド
・Bundleクラスのインスタンスが引数として渡される
・スーパークラスのonCreateメソッド呼出
・レイアウト表示
Bundleクラス
・アプリ情報を保管するための役割を果たすクラス
R.layout.activity_main
・リソースの「layout」フォルダにある「activity_main.xml」を示す定数
・この定数を参照する値が「R.layout.activity_main」となる
▼L:\Android\AndroidStudioProject\App20180302\app\src\main\res\layout\activity_main.xml
MainActivity.java
▼L:\Android\AndroidStudioProject\App20180302\app\src\main\java\tokyo\w3c\android0\app20180302\MainActivity.java
package tokyo.w3c.android0.app20180302;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
▼L:\Android\AndroidStudioProject\App20180302\app\src\main\res\layout\activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
tools:context="tokyo.w3c.android0.app20180302.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</android.support.constraint.ConstraintLayout>
xmlns:☆☆属性
・XML名前空間
・AndroidにおけるXMLの要素を利用するためのもの
・これらを記述することで、ここに書かれているタグがAndroidのレイアウト用のものとして認識されるようになる
tools:☆☆属性
・デザインツールでの挙動に関する設定
※アプリが実際に表示される際の設定ではない
・デフォルト設定値から変更する必要はない
P111.テキストを表示する / 2.2 アプリケーションの基本を覚える
activity_main.xmlを開く
画面下にある「Design」タグをクリックしてデザインツールへ切り替える
左側にあるパレットから「Text」から「TextView」部品をドラッグし、パレットの右のデザインする領域にドロップして配置
・配置した部品を選択し、プロパティから以下の項目に値を設定
layout.width | 「match_constraint」を選択 |
---|---|
text | 「Hello Android!」と設定 |
textSize | 「36sp」と設定 |
▼L:\Android\AndroidStudioProject\App20180302\app\src\main\res\layout\activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
tools:context="tokyo.w3c.android0.app20180302.MainActivity">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textSize="36sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Hello Android!" />
</android.support.constraint.ConstraintLayout>
切り替わらず苦しむ
Android Studio 側でコードを修正し、スマホにアプリを再読み込み
・実機デバッグだから?
・エミュレーターで試す
・まさかの「Hello World!」
・なんでやねん!
原因判明
「tools:text」を記述している場合は、こちらの変更も必要
・画面下にある「Text」タグをクリックしてソースコード画面へ切り替える
▼L:\Android\AndroidStudioProject\App20180302\app\src\main\res\layout\activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
tools:context="tokyo.w3c.android0.app20180302.MainActivity">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:text="Hello Android!"
android:textSize="36sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:text="Hello Android!" />
</android.support.constraint.ConstraintLayout>
・TextView の android:text と tools:text について
・Tools Attributes Reference
P114.複数のウィジェットを配置する
▼L:\Android\AndroidStudioProject\App20180302\app\src\main\res\layout\activity_main.xml
FrameLayoutで囲うのを忘れていたので、最初からやり直した
▼L:\Android\AndroidStudioProject\App20180302\app\src\main\res\layout\activity_main.xml
EditText
・テキストを入力するためのウィジェット
<Button android:onClick="button_onClick" />
・「ボタンをタップすると、button_onClickメソッドを実行する」という設定を行っている
MainActivity.java
▼L:\Android\AndroidStudioProject\App20180302\app\src\main\java\tokyo\w3c\android0\app20180302\MainActivity.java
(TextView)this.findViewById(R.id.textView); / (EditText)this.findViewById(R.id.editText);
(TextView)findViewById(R.id.textView); / (EditText)findViewById(R.id.editText);
findViewById(R.id.textView); / findViewById(R.id.editText);
・Android StudioではじめるAndroidプログラミング入門 第3版 Android Studio 2対応
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
tools:context="tokyo.w3c.android0.app20180302.MainActivity">
<LinearLayout
android:layout_width="368dp"
android:layout_height="495dp"
android:orientation="vertical"
tools:layout_editor_absoluteX="8dp"
tools:layout_editor_absoluteY="8dp">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="36sp"
tools:text="Your name:" />
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:text="Name"
android:textSize="24sp" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="button_onClick"
android:text="Button"
android:textSize="24sp"
tools:text="Click" />
</LinearLayout>
</android.support.constraint.ConstraintLayout>
FrameLayoutで囲うのを忘れていたので、最初からやり直した
▼L:\Android\AndroidStudioProject\App20180302\app\src\main\res\layout\activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
tools:context="tokyo.w3c.android0.app20180302.MainActivity">
<FrameLayout
android:layout_width="368dp"
android:layout_height="495dp"
tools:layout_editor_absoluteX="8dp"
tools:layout_editor_absoluteY="8dp">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="36sp"
tools:text="Your name:" />
<EditText
android:id="@+id/editText"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:text="Name"
android:textSize="24sp" />
<Button
android:id="@+id/button"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="button_onClick"
android:text="Button"
tools:text="Click" />
</LinearLayout>
</FrameLayout>
</android.support.constraint.ConstraintLayout>
EditText
・テキストを入力するためのウィジェット
<EditText
android:id="@+id/editText2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:inputType="textPersonName"
android:text="Name"
android:textSize="24sp" />
<Button android:onClick="button_onClick" />
・「ボタンをタップすると、button_onClickメソッドを実行する」という設定を行っている
書き方は3種類
MainActivity.java
▼L:\Android\AndroidStudioProject\App20180302\app\src\main\java\tokyo\w3c\android0\app20180302\MainActivity.java
(TextView)this.findViewById(R.id.textView); / (EditText)this.findViewById(R.id.editText);
package tokyo.w3c.android0.app20180302;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void button_onClick(View view) {
TextView text = (TextView)this.findViewById(R.id.textView);
EditText edit = (EditText)this.findViewById(R.id.editText);
Editable s = edit.getText();
text.setText("Hi," + s + "!");
}
}
(TextView)findViewById(R.id.textView); / (EditText)findViewById(R.id.editText);
package tokyo.w3c.android0.app20180302;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void button_onClick(View view) {
TextView text = (TextView)findViewById(R.id.textView);
EditText edit = (EditText)findViewById(R.id.editText);
Editable s = edit.getText();
text.setText("Hi," + s + "!");
}
}
findViewById(R.id.textView); / findViewById(R.id.editText);
package tokyo.w3c.android0.app20180302;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void button_onClick(View view) {
TextView text = findViewById(R.id.textView);
EditText edit = findViewById(R.id.editText);
Editable s = edit.getText();
text.setText("Hi," + s + "!");
}
}
・Android StudioではじめるAndroidプログラミング入門 第3版 Android Studio 2対応
エラー: シンボルを見つけられません
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
* Get more help at https://help.gradle.org
BUILD FAILED in 1s
16 actionable tasks: 3 executed, 13 up-to-date
* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:compileDebugJavaWithJavac'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:100)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:70)
at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:63)
at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:248)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:241)
at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:230)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:124)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:80)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:105)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:99)
at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:625)
at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:580)
at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:99)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: org.gradle.api.internal.tasks.compile.CompilationFailedException: Compilation failed; see the compiler error output for details.
at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:51)
at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:36)
at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:99)
at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:52)
at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:37)
at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:35)
at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:25)
at org.gradle.api.internal.tasks.compile.incremental.IncrementalCompilationFinalizer.execute(IncrementalCompilationFinalizer.java:39)
at org.gradle.api.internal.tasks.compile.incremental.IncrementalCompilationFinalizer.execute(IncrementalCompilationFinalizer.java:24)
at org.gradle.api.tasks.compile.JavaCompile.performCompilation(JavaCompile.java:198)
at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:129)
at com.android.build.gradle.tasks.factory.AndroidJavaCompile.compile(AndroidJavaCompile.java:95)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$IncrementalTaskAction.doExecute(DefaultTaskClassInfoStore.java:173)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:121)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:122)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:197)
at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:107)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:111)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:92)
... 27 more
* Get more help at https://help.gradle.org
BUILD FAILED in 8s
14 actionable tasks: 3 executed, 11 up-to-date
Error:(19, 53) エラー: シンボルを見つけられません
シンボル: 変数 id
場所: クラス MainActivity
エラー: シンボルを見つけられません シンボル: 変数 id 場所: クラス MainActivity
This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you add constraints
・そのまま実行してもコンパイルエラーにはならない
・関係ないのかよ!
・(TextView)this.findViewById(R.id.textView);と (TextView) findViewById(R.id.textView);について
P123.レイアウト用XMLファイルを使わない方法
前提
Androidアプリ作成において、レイアウト用XMLファイルは必須ではない
・別になくても良い
・Androidアプリは、Javaのコードさえ書けば、アプリの全てを完全に記述することが出来る
TextViewをJavaコードで記述するメリット及びデメリット
特徴
・レイアウトファイル未使用
・ウィジェットは、それぞれのクラスをnewで作成して作る
メリット
・ダイナミックに変更できる点
デメリット
・コード量が増大しがち
・レイアウトファイルのように感覚的に作成不可
コード
LinearLayoutのsetOrientation
・ウィジェットを並べる方向を設定
LinearLayout.VERTICAL
・縦に並ぶよう設定
ウィジェットの組み込み
・Activityへの組み込み … setContentView使用
・ウィジェット内への別ウィジェットの組み込み(レイアウトのウィジェットへGUI関係のウィジェットを組み込み) … ウィジェットのaddViewメソッド使用
Clickイベント
・ViewクラスのOnClickListenerというイベントリスナーで処理する
・「ViewクラスのOnClickListenerイベントリスナー」インスタンスを、ウィジェットの「setOnClickListenerメソッド」引数に指定
ウィジェット.setOnClickListener(OnClickListenerインスタンス);
OnClickListenerインターフェース
・Clickイベントの際に呼び出されるonClickというメソッドが1つ用意されている
MainActivity.java
package tokyo.w3c.android0.no_layoutxml;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.TextView;
import static android.view.View.OnClickListener;
public class MainActivity extends AppCompatActivity {
private TextView textView;
private EditText editText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
createContent();
//setContentView(R.layout.activity_main);
}
private void createContent(){
final MainActivity activity = this;
// FrameLayout作成
FrameLayout fl = new FrameLayout(this); //引数には利用するViewインスタンス(ここではMainActivityインスタンス)を設定
this.setContentView(fl);
// LinearLayout作成
LinearLayout ll = new LinearLayout(this); //引数には利用するViewインスタンス(ここではMainActivityインスタンス)を設定
ll.setOrientation(LinearLayout.VERTICAL); //ウィジェットを並べる方向を縦に設定
fl.addView(ll);
// TextView作成
textView = new TextView(this);
textView.setText("Your name:");
textView.setTextSize(36.0f);
ll.addView(textView);
// EditText作成
editText = new EditText(this);
editText.setTextSize(24.0f);
ll.addView(editText);
// Button作成
Button btn = new Button(this);
btn.setText("Click");
btn.setTextSize(24.0f);
ll.addView(btn);
btn.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View view) {
activity.button_onClick(view);
}
});
}
public void button_onClick(View view){
Editable s = editText.getText();
textView.setText("Hi," + s + "!");
}
}
P130
オプションメニュー
アプリ画面の上部にある「アクションバー」をタッチすると表示されるメニュー
・Android端末のメニューボタン(機器に付いているハードウェアのボタン。ハンバーガーメニュー)を押すと、画面にポップアップして現れるメニュー
・Activityの機能として組み込まれており、Activityに用意されているイベントを利用して簡単に実装できる
・Activityクラスにある「onCreateOptionsMenu」メソッドをオーバーライドして作成
オプションメニューはどのメニューを選択しても、onOptionsItemSelectedメソッドが呼び出される
・その中で「どれを選んだか」をチェックし、分岐処理するのが基本
「res」フォルダ上で右クリックし、「Android Resource Directory」をクリック
・ここで「menu」フォルダを作成し、「main.xml」ファイルを作成
・「Resource Type」を「menu」に変更して「OK」をクリック
・作成した「menu」フォルダ上で右クリックし、「file」をクリック
・開いた「New File」でファイル名を入力
・menu_main.xmlというXMLファイルを作成
・作成したmain.xmlにオプションメニューのレイアウトを作成
menuタグ
・オプションメニューを表示するための要素
・1つ以上のitemタグを保持
・オプションメニューを表示する
res/values/strings.xml
MenuInflater
・メニュー生成を行うための機能を提供するクラス
・Activityには、「そのActivityで使うメニューを生成するためのMenuInflaterインスタンス」が組み込まれている
R
・Androidに用意されている「各種XMLファイルを参照する値」をstaticフィールドとしてまとめてあるクラス
メニューのリソースを指定する値
・R.menu.activity_mainで設定されている
R.meu.activity_main
・Rクラスの「menu」内部クラスにあるmainフィールド
→「res」フォルダの「menu」フォルダにあるactivity_main.xml(ここではmenu_main.xml)ファイルが示す値
MainActivity.java
package work.w4c.android0.androidtoast20180420;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
static final String MENU_ITEM = "menu item";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
menu.add(MENU_ITEM);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (MENU_ITEM.equals(item.getTitle())){
Toast toast = Toast.makeText(this,"Hello, Toast!!",
Toast.LENGTH_LONG);
toast.show();
}
return super.onOptionsItemSelected(item);
}
}
回答を得られなかったQ
onCreateOptionsMenuで、エラー: シンボルを見つけられません
MainActivity.java
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
//中略
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
・下記エラーになります
エラー: シンボルを見つけられません
シンボル: 変数 menu
場所: クラス R
・「res」フォルダに「menu」がないのですが、これは自分で作成するのでしょうか?
・「run」したら自動で作成されるのかな、と思っていたのですが、
・それとも何かバージョンの問題ですか?
P137.アラートダイアログ / setMessage
AlertDialogを使用するためには?
AlertDialog作成機能を提供する「Builder」クラスのインスタンスを取得
デモ内容
AlertDialog表示
・選択肢なし
コード
MainActivity.java
package work.w4c.android0.androidtoast20180420;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
static final String MENU_ITEM = "menu item";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
menu.add(MENU_ITEM);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (MENU_ITEM.equals(item.getTitle())){
//Toast toast = Toast.makeText(this,"Hello, Toast!!",
// Toast.LENGTH_LONG);
//toast.show();
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Message");
builder.setMessage("これがアラートダイアログの表示です。");
builder.show();
}
return super.onOptionsItemSelected(item);
}
}
P139 AlertDialogにボタンを設定する / setMessage
AlertDialogに表示されるボタン
PositiveButton
・肯定的な選択肢となるボタン
NegativeButton
・否定的な選択肢となるボタン
NeutralButton
・中立な選択肢となるボタン
デモ内容
AlertDialogに対して、「OK」「NG」ボタン表示
・選択肢なし → 選択肢2
コード
▼MainActivity.java
package work.w4c.android0.androidtoast20180420;
import android.app.Activity;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
static final String MENU_ITEM = "menu item";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
menu.add(MENU_ITEM);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (MENU_ITEM.equals(item.getTitle())){
final Activity activity = this;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Message");
builder.setMessage("これがアラートダイアログの表示です。");
builder.setPositiveButton("わかった",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast toast = Toast.makeText(activity , "ダイアログを閉じました。",
Toast.LENGTH_LONG);
toast.show();
}
});
builder.setNegativeButton("キャンセル",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast toast = Toast.makeText(activity , "キャンセルしました。",
Toast.LENGTH_LONG);
toast.show();
}
});
builder.show();
}
return super.onOptionsItemSelected(item);
}
}
P141 選択リストを表示するsetItems
選択肢が多い場合
アラートダイアログにリストを表示させる
注意事項
「setMessage」「setItems」は併用不可
デモ内容
AlertDialog表示
・選択肢3
コード
▼MainActivity.java
package work.w4c.android0.androidtoast20180420;
import android.app.Activity;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
static final String MENU_ITEM = "menu item";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
menu.add(MENU_ITEM);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (MENU_ITEM.equals(item.getTitle())){
//Toast toast = Toast.makeText(this,"Hello, Toast!!",
// Toast.LENGTH_LONG);
//toast.show();
//AlertDialog.Builder builder = new AlertDialog.Builder(this);
//builder.setTitle("Message");
//builder.setMessage("これがアラートダイアログの表示です。");
//builder.show();
/*
final Activity activity = this;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Message");
builder.setMessage("これがアラートダイアログの表示です。");
builder.setPositiveButton("わかった",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast toast = Toast.makeText(activity , "ダイアログを閉じました。",
Toast.LENGTH_LONG);
toast.show();
}
});
builder.setNegativeButton("キャンセル",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast toast = Toast.makeText(activity , "キャンセルしました。",
Toast.LENGTH_LONG);
toast.show();
}
});
builder.show();
*/
final Activity activity = this;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("選択してください");
final String[] items = {"ONE", "TWO", "THREE"};
builder.setItems((CharSequence[])items,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast toast = Toast.makeText(activity, items[i] + "を選択しました。",
Toast.LENGTH_LONG);
toast.show();
}
});
builder.show();
}
return super.onOptionsItemSelected(item);
}
}
P149 TimerでProgressDialogを操作する
デモ内容
・java.util.Timerを利用して毎秒10ずつProgressDialogの値を増加
・最大値(100)になったら、ダイアログを終了
コード
▼MainActivity.java
package work.w4c.android0.androidtoast20180420;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import java.util.Timer;
import java.util.TimerTask;
public class MainActivity extends AppCompatActivity {
static final String MENU_ITEM = "menu item";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
menu.add(MENU_ITEM);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
if (MENU_ITEM.equals(item.getTitle())){
//Toast toast = Toast.makeText(this,"Hello, Toast!!",
// Toast.LENGTH_LONG);
//toast.show();
//AlertDialog.Builder builder = new AlertDialog.Builder(this);
//builder.setTitle("Message");
//builder.setMessage("これがアラートダイアログの表示です。");
//builder.show();
/*
final Activity activity = this;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Message");
builder.setMessage("これがアラートダイアログの表示です。");
builder.setPositiveButton("わかった",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast toast = Toast.makeText(activity , "ダイアログを閉じました。",
Toast.LENGTH_LONG);
toast.show();
}
});
builder.setNegativeButton("キャンセル",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast toast = Toast.makeText(activity , "キャンセルしました。",
Toast.LENGTH_LONG);
toast.show();
}
});
builder.show();
*/
/*
final Activity activity = this;
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("選択してください");
final String[] items = {"ONE", "TWO", "THREE"};
builder.setItems((CharSequence[])items,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
Toast toast = Toast.makeText(activity, items[i] + "を選択しました。",
Toast.LENGTH_LONG);
toast.show();
}
});
builder.show();
*/
final Timer timer = new Timer();
final ProgressDialog dlog = new ProgressDialog(this);
dlog.setTitle("経過表示");
dlog.setMax(100);
dlog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dlog.setOnCancelListener(new DialogInterface.OnCancelListener() {
@Override
public void onCancel(DialogInterface dialogInterface) {
timer.cancel();
}
});
dlog.show();
TimerTask task = new TimerTask() {
@Override
public void run() {
dlog.incrementProgressBy(10);
if (dlog.getProgress() >= dlog.getMax()){
dlog.dismiss();
timer.cancel();
}
}
};
timer.schedule(task,1000,1000);
}
return super.onOptionsItemSelected(item);
}
}