新規プロジェクト作成
状態:確認中
閲覧数:1,461
投稿日: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" 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" 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" 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" 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" 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); } } |