Android Studio ではじめる Android プログラミング入門 第3版 Android Studio 2対応

書籍Android Studio ではじめる Android プログラミング入門 第3版 Android Studio 2対応

新規プロジェクト作成

 状態:確認中  閲覧数:1,308  投稿日:2018-02-24  更新日:2018-03-12
Android Studio を起動
・[File] > [New] > [New Project] をクリック
過去にプロジェクトを開いていない場合、Android Studio にオープニング画面が表示されます。新規プロジェクトを作成するには、[Start a New Android Studio 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
[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
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 アプリケーションの基本を覚える

 閲覧数:282 投稿日:2018-03-09 更新日:2018-03-14

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 アプリケーションの基本を覚える

 閲覧数:292 投稿日:2018-03-14 更新日:2018-03-18

activity_main.xmlを開く


画面下にある「Design」タグをクリックしてデザインツールへ切り替える

左側にあるパレットから「Text」から「TextView」部品をドラッグし、パレットの右のデザインする領域にドロップして配置
・配置した部品を選択し、プロパティから以下の項目に値を設定
layout.width 「match_constraint」を選択
text 「Hello Android!」と設定
textSize 「36sp」と設定
画面下にある「Text」タグをクリックしてXMLのソースコード表示画面へ切り替える
▼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.複数のウィジェットを配置する

 閲覧数:279 投稿日:2018-03-18 更新日:2018-03-27
▼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">

   <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対応

エラー: シンボルを見つけられません

 閲覧数:290 投稿日:2018-03-22 更新日:2018-03-23
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ファイルを使わない方法

 閲覧数:369 投稿日:2018-03-27 更新日:2018-04-19

前提


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

 閲覧数:277 投稿日:2018-04-20 更新日:2018-04-30

オプションメニュー


アプリ画面の上部にある「アクションバー」をタッチすると表示されるメニュー
・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

 閲覧数:275 投稿日:2018-05-01 更新日:2018-05-06

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

 閲覧数:321 投稿日:2018-05-02 更新日:2018-05-06

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

 閲覧数:377 投稿日:2018-05-04 更新日:2018-05-06

選択肢が多い場合


アラートダイアログにリストを表示させる

注意事項


「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を操作する

 閲覧数:299 投稿日:2018-05-07 更新日:2018-05-08

デモ内容


・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);
   }
}





週間人気ページランキング / 5-12 → 5-18
順位 ページタイトル抜粋 アクセス数
アクセスが、ありませんでした! 0
2024/5/19 1:01 更新