AndroidStudioに再挑戦
by K.I
2021/09/16〜
Index
- 数年前、Androidの開発環境をEcripseからAndroidStudioに変更しようとして挫折した。
- で、VisualStudioのXamarinでやろうとして、やはり挫折した
- 何となく思い立って、再挑戦してみたが、前回の環境と全く別物になっている様だ。
- 意外と使い勝手がよさそうなので、続けてやってみようと思う
- ちなみに自分の環境は、
- Windows 10 Pro
- Intel Core i7-9700K
- AndroidStudio Arctic Fox | 2020.3.1 Patch 2
- 実機デバッグ用に、Nexas5をデバッグモードでUSB接続
- 実は、AndroidStudioのインストールは何度も挑戦したが、起動後、すぐに停止してしまう状態になった。
- 仕方がないので、Windows10のクリーンインストールからやり直したら、簡単にインストールに成功した。。
1以前は必要だったと思うが、現在は特に必要ないらしい。
[top]
- New Projectで、Empty Activityを選択する
- AndroidStudioのプロジェクト構成は以前のものと全然違うものになっている
- app
- java
- com.example.emptyact
- com.example.emptyact(androidTest)
- ExampleInstrumentedTest.kt
- com.example.emptyact(test)
- java(generated)
- res
- drawable
- ic_launcher_background.xml
- ic_launcher_foreground.xml(v24)
- layout
- mipmap
- ic_launcher(6)
- ic_launcher_round(6)
- values
- colors.xml
- strings.xml
- themes(2)
- res(genarated)
- Gradle Scripts
- 物理ディスク上のファイル構成は、プロジェクト構成とはかなり異なっている
- EmptyAct
- .gradle
- .idea
- app
- build
- libs
- src
- androidTest
- java
- com
- example
- emptyact
- ExampleInstrumentedTest.kt
- main
- java
- res
- drawable
- drawable-v24
- layout
- mipmap-anydpi-v26
- mipmap-hdpi
- mipmap-mdpi
- mipmap-xhdpi
- mipmap-xxhdpi
- mipmap-xxxhdpi
- values
- colors.xml
- strings.xml
- themes.xml
- values-night
- AndroidManifest.xml
- test
- build
- gradle
- メインのActivityは、Kotlinって奴で記述されている
package com.example.emptyact
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
- KotlinはJavaの改良版で、Javaと同様にJava仮想マシン上で動くらしい
- 普通にJavaのメソッドを呼んで、リソースで定義したLayoutをActivityにセットしているだけの様だ
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.emptyact">
<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/Theme.EmptyAct">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.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=".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" />
</androidx.constraintlayout.widget.ConstraintLayout>
- これはJavaで記述されているが、自動生成みたいなので弄ることはないってことか
/**
* Automatically generated file. DO NOT MODIFY
*/
package com.example.emptyact;
public final class BuildConfig {
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.example.emptyact";
public static final String BUILD_TYPE = "debug";
public static final int VERSION_CODE = 1;
public static final String VERSION_NAME = "1.0";
}
- KotlinとJavaを混在できるってことかな?
- でもこれなら、全部Kotlinで記述することも出来そうな感じだ
[top]
- adbは、コマンドラインで、USB接続されたAndroidt端末をいろいろ操作できるツール
- でも、Path設定しないと使えないみたいなので、まずPath設定を行う
- SDKの場所を確認
- 自分の場合は、
- C:\Users\ユーザ名\AppData\Local\Android\Sdk
- AndroidStudioのSDK Managerでの確認
- SDK Platform ⇒Android 11.0(R)
- SDK Tools ⇒Android SDK Platform-Toolsのチェックを確認
- コマンドプロンプトを再起動すると、adbコマンドが使えるようになった
- AndroidStudioのTerminalからも、実行可能になった
- あらかじめUSBデバッグを有効にしたAndroid端末をUSB接続しておく
- AndroidStudioの下部のTerminalをクリックして、ターミナルを表示する
- 右クリック⇒View Mode⇒Windowで、独立したWindowにしておいた方が使いやすいと思う
> adb devices
List of devices attached
0bd33489032f917a device
- 試しにAndroid端末の画面のスクリーンショットを撮って、そのファイルをPCに取り込んでみる
>adb shell screencap -p /sdcard/screen.png
>adb pull /sdcard/screen.png
/sdcard/screen.png: 1 file pulled, 0 skipped. 2.4 MB/s (44050 bytes in 0.017s)
- 逆にPCからAndroid端末にデータを書き込む場合
> adb push local.file /sdcard/
> adb shell wm size
Physical size: 1080x1920
> adb shell pm list packages
>adb shell
>run-as アプリパッケージ名
>ls
cache
files
>ls files
test.lis
>cat /data/data/アプリパッケージ名/files/test.lis > /sdcard/test.lis
>exit
>adb pull /sdcard/test.lis
- デバッグ用にLog表示を行うLogCatを使ってみる
- AndroidStudioの下部のLogcatをクリックして、LogCatを表示する
- 右クリック⇒View Mode⇒Windowで、独立したWindowにしておいた方が使いやすいと思う
- 表示が多いので、キーワードで検索すると良い
- 右端の、Show only seledted applicationのDownリストから、Edit Filter Configurationを選択して、詳細な検索条件を入れることもできる
- ちなみに、デバッグ用のLog.dでの出力が、一部表示されない場合があったりするが、
- ドロップダウンメニューで、Verbose⇔Debugを切り替えたりするとちゃんと表示される
- 表示が間に合わなかっただけで、内容は保持されているんじゃないかと思う
- widget.Toastで、画面に簡単なメッセージを表示する
import android.widget.Toast
:
protected fun showMessage(msg: String) {
Toast.makeText(this, msg, Toast.LENGTH_SHORT).show()
}
:
showMessage("Hello World!")
- showMessageのような簡単なメソッドを作っておく
- コードを追加した場合、Importが必要なメソッドが赤く表示され、カーソルを持っていくと、
- Import Alt+Shift+Enter
- More Action... Alt+Enter
- とか表示されて、Importを促されるんだけど、これを自動で行うこともできる
- Fileメニュー⇒Settings...のEdirot⇒General⇒Auto ImportのKotlinの項目で、
- Add unambiguous imports on the fly
- Optimize imports on the fly
- をチェックすると、自動的にインポートされるようになる
- これは良し悪しだけど、自分はインポート考えるの面倒なので、ONにしてみた
- AndroidStudioでKotlinのソースに、Javaのコードを貼り付けると、自動的にKotlinのコードに変換される
- Kotlinの記述方法に全然慣れていないので、この機能はとても有難い
- でもKotlinを生かしたコードにするためには、多少修正が必要らしい
- 短いJavaのコードを貼り付けた時、Kotlinに変換されないことがある
- その場合、File⇒New⇒ScratchFileで、表示されるDialogでJavaを選択
- それに短いJavaコードを貼り付けて、Ctrl-Aで全選択、Ctrl-Cでコピーして、
- 改めて最初と同様に貼り付けると、Kotlinに変換される
- ScratchFileで、明示的にJavaコードとして認識されるらしい
- まぁ、でもKotlin変換にはちょっと癖がある
- 以下のような、コードになる
fun abc(aaa: Int): Int {
return if (aaa > 0.5) 1 else if (aaa < -0.5) -1 else 0
}
ifは値を返すので、正しいんだけど、ちょっと解り辛い2
2慣れると、この方が見やすいということになるのかもしれないけど。。
[top]
- Kotlinの文法にもちょっと慣れてきたので、
- AndroidStudioを使って、簡単なアプリを作ってみよう
- New Projectで、No Activityを選択して、Nextボタンを押す
- Nameでアプリ名を指定して、Save locationで適当なディレクトリを指定、
- LanguageはKotlin、Minimum SDKはAPI21:Android5.0(Lolipop)
- と、基本的にデフォルトで、Finishボタンを押す
Could not identify launch activity: Default Activity not found
Error while Launching activity
- Activityがないので、実行できない状態らしい
- この何も無い状態から、アプリケーションを作ってみよう
- 以前、Javaで作成したグラフィックスを表示するものをKotlinで作り直してみる
- app
- manifests
- AndroidManifest.xml ⇒Manifestファイルは一応ある
- java
- com.example.testapp ⇒コードは空っぽなのでここにKotlinコードを追加する
- com.example.emptyact(androidTest)
- com.example.emptyact(test)
- java(generated)
- res ⇒Layoutリソースも無いみたいなので作ろう
- drawable
- mipmap
- values
- res(genarated)
- Gradle Scripts
- 描画するためのカスタムViewクラスを作成する(CustomView.kt)
package com.example.testapp
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.RectF
import android.util.AttributeSet
import android.view.View
class CustomView : View {
constructor(cont: Context?) : super(cont) {}
constructor(cont: Context?, attr: AttributeSet?) : super(cont, attr) {}
override protected fun onDraw(c: Canvas) {
c.drawColor(Color.BLACK)
val fill_paint = Paint()
fill_paint.setStyle(Paint.Style.FILL)
fill_paint.setColor(Color.BLUE)
c.drawRect(500f, 500f, 1000f, 1000f, fill_paint)
fill_paint.setColor(Color.RED)
c.drawOval(RectF(0f, 0f, 500f, 500f), fill_paint)
}
override protected fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
val widthSize = MeasureSpec.getSize(widthMeasureSpec)
val heightSize = MeasureSpec.getSize(heightMeasureSpec)
setMeasuredDimension(widthSize, heightSize)
}
}
- resフォルダを右クリックして、New⇒AndroidResourceDirectory
- ResourceTypeをLayoutにしてLayoutディレクトリを作成
- さらに、New⇒AndroidResourceFile
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="0.04"
android:gravity="center_vertical|center_horizontal"
android:text="Title"
android:textAppearance="?android:attr/textAppearanceLarge" />
<com.example.testapp.CustomView
android:id="@+id/customView1"
android:layout_width="match_parent"
android:layout_height="290dp"
android:layout_weight="0.20" />
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="41dp"
android:text="Button" />
</LinearLayout>
- このLayoutファイルは、TextViewと、作成したCustomView、Buttonを表示するもの
- Manufestファイルに、testAppアクティビティを追加する(AndroidManifest.xml)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.testapp">
<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/Theme.TestApp" >
<activity
android:name=".testApp"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
- string/app_nameは、デフォルトで設定されている
- メインとなるtestAppアクティビティ(testApp.kt)
package com.example.testapp
import android.os.Bundle
import android.app.Activity
class testApp : Activity() {
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
}
}
- JavaのコードをAndroidStudioに貼り付けて、自動的にKotlinに変換しただけだが
- Javaとほとんど違和感なく、KotolinでAndroidのプログラミングが出来そうだ
- Buttonがあるので、ボタンの応答を追加しておく
package com.example.testapp
import android.os.Bundle
import android.app.Activity
import android.widget.Toast
import android.view.View
class testApp : Activity() {
public override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.main)
findViewById<View>(R.id.button1).setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
Toast.makeText(this@testApp, "Hello World!", Toast.LENGTH_LONG).show()
}
})
}
}
- これでボタンを押すと、Toastで、"Hello World!"と表示する
- とりあえず、基本的な使い方は特に問題なくできるようだ
- 自動変換に頼っているので、Kotlinらしからぬコードになっているかもしれないが、
- そこらへんは、おいおい勉強して直していくということで
[top]
- ActivityのonCreateでGetWidth(),GetHeight()しても0が返るので、
- カスタムViewのonMeasureでは、複数回呼ばれ1回では確定しないので、
- onLayoutでgetMeasuredWidth(),getMeasuredHeight()を使うのが良いみたい
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
super.onLayout(changed, left, top, right, bottom)
val vvv = findViewById<View>(R.id.customView1)
Log.d("ViewSizex", "w = "+vvv.getWidth()+" h = "+vvv.getHeight())
Log.d("ViewSizem", "w = "+getMeasuredWidth()+" h = "+getMeasuredHeight())
}
- RendererのonSurfaceChangedでも良さそう
override fun onSurfaceChanged(gl: GL10, width: Int, height: Int) {
GLES20.glViewport(0, 0, width, height)
Log.d("ViewSizes", "w=$width, h=$height")
}
- Alt-Enter 修正候補の表示
- Ctrl-W 選択範囲を拡張
- Ctrl-Shift-↑↓ 選択部分の移動
- Ctrl-Shift-/ 選択部分の範囲コメントアウト( /* 〜 */ )
- Ctrl-/ 選択部分の行コメントアウト( // )
- Alt-F7 カーソル位置のワード検索
- Shift2回 検索
- Ctrl-Shift-F パスを指定して検索
- Shift-F6 カーソル位置のワードのリネーム
- Alt-↑↓ 前後のメソッドへ移動
- Ctrl-Space コード補完
- Ctrl-B 定義に移動
- Ctrl-O Override可能なメソッド表示
- Ctrl-P パラメータ表示
- Ctrl-Q クイックドキュメント表示
- Ctrl-Alt-L コード整形
- Ctrl-Alt-H カーソル位置のメソッドの呼出先一覧表示
- Ctrl-Alt-O インポート最適化
- Ctrl-F12 現在のファイルのメソッドや変数の一覧表示
- Ctrl-Alt-Lで、簡単にコード整形できて良いけど、したくない箇所もあったりする
- File⇒Settings...で、Settinsダイアログを開いて、
- Editor⇒Code StyleのFormatter Control
- Enable formatter markers in commentsにチェックすると、以下が有効になる
- Formatter off : @formatter:off
- Formatter on : @formatter:on
- コード整形したくない部分を、@formatter:off〜@formatter:onで括っておけば
- GitHubは以前使ったことがあったので、アカウントは取得済み。
- ブラウザでGithubへサインインして、2段階認証でLogin出来ることを確認してある
- VCS⇒Enable Version Contro Integration
- 右下に、Cannot Run Git
- Git is not installed
- Download and install と表示されるので、クリック
- Git for Windowsがインストールされる
- 改めて、VCS⇒Enable Version Contro Integration
- Git を選択して、OK
- Created Git repository in D:\work2021\android\testOpenglと表示される3
- これでVCSメニューが無くなって、Gitメニューになった
- プロジェクトファイルのファイルの色が赤っぽくなった
- Git⇒GitHub⇒Share Project On GitHub
- Add accountで、以下の3つがあるけど
- Login via Github ⇒JetBrains IDEじゃなきゃダメみたい。Loginできない
- Login with Token ⇒Tokenって何だ?
- Login to Github enterprise ⇒サーバを指定してLoginするのかな?
- ちょっと調べてみると、GitHubはパスワードログインを止めて、トークンによりアクセスするようになったらしい。
- Login with Tokenを選択して、Add GitHub Accountの画面で、Generateボタンを押すと、
- Authenticator appのみ Configuredになっている
- 2段階認証が有効になっているためだろうと思うので、Confirmを押すと、
- パスワード入力になるので、Githubのパスワードを入れる
- New personal access tokenの画面になる
- Expiration(有効期限)は30日となっているが、とりあえずそのまま
- いろいろ設定項目はあるけど、良くわからないので、そのままGenerate tokenボタンを押す
- Personal access tokensの画面となる
- tokenが生成されたみたいなので、コピーしておく4
- それで、Add GitHub Accountの画面で、コピーしたtokenを入力すると、
- Share Project On GitHubの画面で、Share byにgithubのアカウント名が表示されるので、Shareボタンを押す
- Add Files For Initial Commitの画面で、Commitされるファイル一覧が表示されるので、Addボタンを押す
- プロジェクトファイルのファイルの色が緑っぽくなった
- でも、右下にエラーが表示されている
Can't finish GitHub sharing process
Successfully created project 'プロジェクト名' on
GitHub, but initial commit failed:
Author identity unknown *** Please tell me who
you are. Run git config --global user.email
"you@example.com" git config --global
user.name "Your Name" to set your account's
default identity. Omit --global to set the identity
only in this repository. unable to auto-detect
email address (got 'ユーザ名@ノード名.(none)')
- これってやれってことかな?Terminalでメールアドレスとユーザ名を設定しておく5
> git config --global user.email "メールアドレス"
> git config --global user.name "ユーザ名"
- Git⇒Commitで、Commit Messageを適当に設定、Commit and Push...
- これで、Commit出来た気がするけど、良くわからないので、
- 抜けがあるかもしれないが、やったことで覚えているものを記録だけ残しておく。。
- 2段階認証は必ず設定しておいた方が良い。Login出来れば、tokenを無くしても再発行するだけで済む。
- コードの行番号の右側をクリックして、ブレークポイントを設定、
- Runボタンではなく、Debugボタンで実行すると、デバッグモードで実行される
- ブレークポイントで、プログラムの実行が中断されて、
- ステップ実行の状態になり、Debuggerウィンドウの以下のボタンが有効になる
- Step Over
- Step Into
- Step Out
- Evaluate Expression
- Resume Program
- Variablesビューに、ステップ実行中の行の変数の値が表示されているので、
- それらを確認しながら、一行づつ実行させることができる
3これでローカルのGitリポジトリが作成されたんだと思う。
4これは無くしちゃダメらしい。
5これは意味があったかどうか、よくわからない。
[top]
- 新規プロジェクトを、Native C++を選択して作成する
- とりあえず、testNativeという名前で作ってみる
- プロジェクト構成はほとんど同じだが、javaフォルダに並んで、cppフォルダが出来る
- cpp
- includes ⇒このフォルダは沢山のファイルが入っている
- CMakeLists.txt
- native-lib.cpp
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
// Example of a call to a native method
binding.sampleText.text = stringFromJNI() // Nativeメソッドの呼出し
}
/**
* A native method that is implemented by the 'testnative' native library,
* which is packaged with this application.
*/
external fun stringFromJNI(): String // Nativeメソッドの宣言
companion object {
// Used to load the 'testnative' library on application startup.
init {
System.loadLibrary("testnative") // C++ライブラリのロード
}
}
}
#include <jni.h>
#include <string>
extern "C" JNIEXPORT jstring JNICALL
Java_com_example_testnative_MainActivity_stringFromJNI(
JNIEnv* env,
jobject /* this */) {
std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
メソッドの名前は、
- Java + package名 + 呼出し側Activity + 関数名 という感じで付けるみたい
- 最初、MainActivity_stringFromJNIと表示されていた6が、クリックすると長い名前になった
char[256] hello = "Hello from C++";
return env->NewStringUTF(hello);
# buildに必要なCmakeの最小バージョン
cmake_minimum_required(VERSION 3.10.2)
# project名
project("testnative")
# buildするライブラリの定義
# ライブラリ名を指定(lib〜.so)
add_library(
testnative
# 静的リンク、動的リンクを指定
SHARED
# sourceファイル名を指定
native-lib.cpp)
# パスを設定する変数名
find_library(
log-lib
# NDKライブラリのパス
log)
# ターゲットライブラリの設定
target_link_libraries(
testnative
# includeするライブラリ
${log-lib})
- ライブラリの確認(APKの解析)
- Build⇒Build Bundle(s)/APK(s)⇒Build APK(s)
- Build⇒Analyze APK
- libに、libtestnative.soが含まれている
- 動的リンクを指定しても、APKに纏められるんだったら、STATICを指定する意味はあるのかな?
- build.gradle(Module:testNative.app)
android {
compileSdk 30
:
externalNativeBuild {
cmake {
path file('src/main/cpp/CMakeLists.txt')
version '3.10.2'
}
}
:
}
- 単純な構成ならば、C++のコードの混在は難しくないようだ。
- 複数のフォルダを追加する場合はどうするんだろう
- 参考を見ると、サブディレクトリ毎にCMakeLists.txtを置いて処理するらしい
- 参考の様に、module1ディレクトリを追加して、、
- cpp
- includes
- CMakeLists.txt
- native-lib.cpp // 関数xxxx呼出し
- module1
- module1.c // 関数xxxxを定義
- CMakeLists.txt
- include
- module1.h // 関数xxxxのプロトタイプ
- native-lib.cppに、関数xxxx呼出しを追加
include "module1";
:
int r = xxxx(10,20,30);
cmake_minimum_required(VERSION 3.10.2)
project("testnative")
add_subdirectory( module1 ) // サブディレクトリ
include_directories( ./module1/include) // インクルードするディレクトリ
add_library( testnative SHARED native-lib.cpp)
find_library( log-lib log)
target_link_libraries( testnative module1 ${log-lib}) // module1も追加する
- module1ディレクトリのCMakeLists.txtは、
cmake_minimum_required(VERSION 3.10.2)
include_directories( ./include)
add_library( module1 STATIC module1.c)
- IDE上では、エラー表示されないが、コンパイルすると、
- error: undefined reference to 'xxxx'になってしまう
- なんか、module1に追加したCMakeLists.txtが実行されてない気がする
- build.gradleにも、なにか記述の追加が必要なのかな?7
- よくわからないので、当面はフォルダに分けず、ベタにファイルを並べて、
- CMakeLists.txtを1つだけにしてお茶を濁すことにする。。
- CMakeLists.txtやbuild.graldeの記述が見たくて、NDKのサンプルをImportしてみる
CMake '3.18.1' was not found in SDK, PATH, or by cmake.dir property.
Tools⇒SDK Manager⇒SDK Toolsタブ
- CMakeとNDKにチェック
- OKボタン
- 完了したら、Finish
EventQueue.isDispatchThread()=false Toolkit.getEventQueue()=com.intellij.ide.IdeEventQueue@7a01c3b7
:
良くわからないが、これは何回か実行したら、何故か動くようになった。
- 少なくとも、最初や構成を変えた時は、象に⇒のようなアイコンの
- Sync Project with Gradle Files を実行した方が良いみたいだ8
- でも結局は、複数のCMakeLists.txtがある場合の例が見つからなかったので、よくわからないままだった。。
6元に戻らないが、短く表示することも出来るんだろうか?
7gradleって、CMake以上に全然分かってないのが問題。。
8それだけが動かなかった理由じゃないみたいだけど。
[top]
- 以下のコードで、リソース読み込みに失敗する
- Layoutのmain.xmlは、問題なさそうだったので原因不明だったが、
- Unresolved_reference:activity_mainを解決できない
- 問題は、android.Rのインポートだった
import android.R
- 回答の要点を抜粋すると
- import android.R してしまうとアプリ用の R クラスにアクセスするのが面倒になるので、
- import android.R は削除して、Android OS がもともと持っているリソースにアクセスする
- 場合には android.R.? という形でアクセスすることをお勧めします。
- JavaのコードをAndroidStudioに貼り付けた時、自動的にimport android.Rが追加されたので
- あまり疑問に思わなかったが、自動のImportは便利だが注意は必要だと改めて思った
- AndroidStudioを始めたばかりで、xmlファイルを疑ってかなり悩んでしまったので、
- いろいろソースとか設定とかを弄っていたら、急にデバイス選択できなくなった。
- Runボタンを押しても、エラーは表示されないが、実行できない
- 別のプロジェクトを開いてみると、全く問題なく実行可能
- 原因不明(未解決)
- 結局、Manifestファイルと、全てのソース、リソースをDesktopへコピーして、
- プロジェクトを閉じて、右の歯車を右クリックして、Remove from Recent Projects
- Disk上の実ファイルをプロジェクトフォルダごと全部削除
- 新規プロジェクト(No Activity)を作成して、コピーしておいたファイルを全て戻した9
- これだけで、問題なく実行可能となった。何だったんだろう?
- ブレークポイントを設定して、Debugで実行、ステップ動作させる
- Logcatには、デバッガを抜けた以降なにも表示されない。
- 変数の値も、追いかけていたが、nullポインタというわけでもなさそうなのに、なんでだ?
- 全く同じ個所でフリーズするので、Access Violation的なものかな?
- いろいろ弄っていたら、Logcatに以下のように表示されるようになった
- 上の階層に、ブレークポイントを追加したら、そこで無限ループになっていた
- Step-inって、上の階層にはステップ動作しないのか。。
- でもStep-overでは上の階層に抜けるだけで、上の階層にステップ動作するわけでもないらしい。
- 上の階層にブレークポイントを置かないとダメみたいだ
- Githubからzipファイルをダウンロードして、別の場所からAndroidStudioでOpenしたら、
- Invalid VCS root mapping と赤字で表示される
- ideaフォルダのvcs.xmlファイルを消してから、Openすると表示されなくなった
- おそらくバージョン管理の辻褄が合わなくなったためだろう
- 再度GitHubのバージョン管理をやり直す必要があると思う
9Manifestファイルだけは、ファイル挿入出来なかったので中身をPasteした。Layoutフォルダも作り直しが必要だった。
[top]
- AndroidStudioをちょっと使ってみた感じでは、とても使いやすい印象
- Kotlinは、Javaとの違和感は無いし、むしろ記述しやすい
- でもKotlinはJavaと結構違うので、まずは文法の勉強から
[top]
[プログラムの部屋に戻る]
⇒ Disqusの広告がうるさすぎるので基本は非表示にしました