20190915のAndroidに関する記事は7件です。

【初心者】Androidアプリ開発 VT-x is disabled in BIOS

はじめに

Androidアプリ開発の初心者です。
androidstudioインストール後、サンプルプログラムを実行しようとして「No Target Device Found」エラーが発生したことについて記事にしました。
【初心者】Androidアプリ開発 No Target Device Found エラー

エラー解消の手順として、AVD(Android仮想デバイス)の新規追加を行いましたが、その際に発生した「VT-x is disabled in BIOS」エラー解消方法について残しておきます。

エラー解消方法

エラー原因

BIOS設定でVT-xが有効になっていなかったため。
最近のPCであれば最初から有効になっているケースが多いようですが、私のPCでは違っていたようです…。

エラー解消方法

1. BIOS起動
Windows10だと「Windowsの設定>更新とセキュリティ>回復」の手順を踏まないとうまくBIOS起動しないようです。
以下のサイトを参考にしました。
 > Windows 10 「BIOS」を起動させる手順をPCメーカー毎に紹介

2. VT-xの有効化設定
VT-xの有効化設定について色々なサイトに情報が落ちていますが、PCメーカーによって表示される画面に差異があるようです。
私の場合はHPがメーカーなので、"hp vt-x 有効化"で検索して調べました。
HPの場合は公式で有効化手順の案内がありました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初心者】Androidアプリ開発 No Target Device Found エラー

はじめに

Androidアプリ開発の初心者です。
androidstudioインストール後、サンプルプログラムを実行しようとして「No Target Device Found」エラーが発生しました。
若干ハマったので解消手順を残しておきます。

実行環境

  • Windows10 Home 64bit
  • Android Studio 3.5 ※日本語化

実行手順

実行結果

ハマった理由

キーワード "No Target Device Found" で検索かけると、以下の手順を紹介しているサイトが多かったため。
【解消手順】
1. [Run]>[Edit Configuration]を開く
2. "Deployment Target Options"の"Target"をからに変更
<参考>Android Studio - No USB devices detected

解消手順実施...できない

日本語化されたAndroid Studioの場合、[実行]>[構成の編集]を開くことになります。
構成の編集画面に、"Deployment Target Options" に該当する項目がありませんでした。

解消方法

原因

AVD(Android仮想デバイス)が存在しなかったため。
androidstudioインストール後に、AVDを作成しないままサンプルプログラムを実行しようとしていました。

解消手順

シンプルにAVDを新規追加するのみです。
[No devices]のプルダウンから[Open AVD Manager]を選択すると、Android仮想デバイスマネージャーが起動します。
Android仮想デバイスマネージャーでAVDを追加すると、無事起動できるようになりました。

解消後実行結果

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

9-patch ファイルの作成

9-patchファイルとは

「スケールする画像」。
UI パーツの大きさに合わせて、キレイに表示してくれる。
角丸などを固定サイズにすることもできるので、自由自在にスケールさせることが可能。

9-patchなし版

9-patchあり版

矢印部分が固定サイズになっている。

手順

Android Studioで、9-Patchの元になるPNG画像を右クリックして、
[Create 9-patch file] をクリック
ドットを打ってスケールするところ、しないところを指定する
  • 上と左がスケールする位置の指定、下と右がコンテンツ領域上と左がスケールする位置の指定、下と右がコンテンツ領域

Git

https://github.com/satoNobu/study_android/tree/9-patch

参考URL

アプリの UI デザイン9-patch の作りかたのまとめと Tips
9-patch入門
公式
フリー素材

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Kotlinを使いこなす 〜Convert Java File to Kotlin File 卒業への道〜 その2

はじめに

Android等でKotlinを使用している場合、Javaから『Convert Java File to Kotlin File』で自動変換している人は多い。実際にそれでも動くのだが、そこをもう1歩先に進みKotlinをより使いこなす為のメモ。

第2回目
今回はAndroidのActivityのViewの動的処理を習得する。
Kotlinバージョン:1.3

Kotlin変換前のサンプルコード

最初にJavaで書かれたサンプルを用意する。処理は。

MainActivity.java
public class MainActivity extends AppCompatActivity {

    Button buttonA;
    TextView textViewA;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        buttonA = (Button) findViewById(R.id.button_A);
        buttonA.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d("", "buttonA");
            }
        });

        textViewA = (TextView) findViewById(R.id.text_viewA);
        textViewA.setText(R.string.text1);

        TextView textViewB = (TextView) findViewById(R.id.text_viewB);
        textViewB.setText(R.string.text2);
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        buttonA.setClickable(false);
        textViewA.setText(R.string.text2);
    }

Kotlin変換後のサンプルコード

これを自動変換して元の形に合わせるときっとこんな感じに・・・。

MainActivity.kt
class MainActivity : AppCompatActivity() {

    var buttonA: Button? = null
    var textViewA: TextView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        buttonA = findViewById<View>(R.id.button_A) as Button
        buttonA?.setOnClickListener { Log.d("", "buttonA") }

        textViewA = findViewById<View>(R.id.text_viewA) as TextView
        textViewA?.setText(R.string.text1)

        val textViewB = findViewById<View>(R.id.text_viewB) as TextView
        textViewB.setText(R.string.text2)
    }

    override fun onRestart() {
        super.onRestart()
        buttonA?.isClickable = false
        textViewA?.setText(R.string.text2)
    }
}

何が問題か

一応、問題なく動作できるが・・・。
まず、メンバー変数を使用するのに毎回Nullableのアンラップ(buttonA?.・・・)しないといけない。
findViewByIdのas *****
という記述もあまり意味がない。

実装方法を考える

方法が2つある
1.メンバー変数に「lateinit」を使い、findViewByIdの型を決める

MainActivity.kt
class MainActivity : AppCompatActivity() {

    lateinit var buttonA: Button
    lateinit var textViewA: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        buttonA = findViewById<Button>(R.id.button_A)
        buttonA.setOnClickListener { Log.d("", "buttonA") }

        textViewA = findViewById<TextView>(R.id.text_viewA)
        textViewA.setText(R.string.text1)

        val textViewB = findViewById<TextView>(R.id.text_viewB)
        textViewB.setText(R.string.text2)
    }

    override fun onRestart() {
        super.onRestart()
        buttonA.isClickable = false
        textViewA.setText(R.string.text2)
    }
}

2.「Kotlin Android Extensions」を使用する
1の方法でも大丈夫だがもっとシンプルに実装もできる。
それが「Kotlin Android Extensions(公式リンク)」

使用するにはgradleにclasspathの追記が必要

build.gradle
buildscript {
    ext.kotlin_version = '1.3.41'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.5.0'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        // 以下の行を追加
        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
    }
}

これで準備OK
findViewByIdを使わなくても実装できるようになる

MainActivity.kt
// ※↓のimportの追記が必要
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        button_A.setOnClickListener { Log.d("", "buttonA") }

        text_viewA.text = getText(R.string.text1)

        text_viewB.text = getText(R.string.text2)
    }

    override fun onRestart() {
        super.onRestart()
        button_A.isClickable = false
        text_viewA.text = getText(R.string.text2)
    }
}

とてもシンプル!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Android】アダプティブアイコンを無料のベクターソフトウェア「Vectr」で作成して設定する

アダプティブアイコンとは

AdaptiveIconとは、Android Oreo(8.0)で新たに導入されたアプリアイコンの新仕様になります。アダプティブアイコンに対応していないアプリはAndroid8.0以上の端末で、中央に小さく表示されてしまいとても不格好なので、是非とも対応したいところです。

アダプティブアイコンは、foregroundとbackgroundの2つの画像で構成されています。これらの画像は今回はSVGのフォーマットで作成していきます。(pngでもできるそうです)

AdaptiveIconについての公式ドキュメントはこちらになります。
https://developer.android.com/guide/practices/ui_guidelines/icon_design_adaptive

アダプティブアイコンの仕様について

もう少し細かい部分の仕様について確認していきます。
アダプティブアイコンは、デバイスのOEMが決めたクリップの仕方によって、アイコンが切り取られます。そのためデバイスAでは丸いアイコン、デバイスBでは角丸の四角形などのようにOEMごとで異なる形状でも対応ができる形式のアイコンとも言えます。さらに、アダプティブアイコンはエフェクトにも対応しています。例えば、Pixel3では、ホーム画面でアダプティブアイコンに対応しているアプリのアイコンを長押しして移動できる状態にして左右に振ったりすると、アイコンがその動きに応じて、見える範囲がanimationしている様子がわかると思います。

また、アダプティブアイコンを作成する上で抑えておくべき要件は以下になります。

  • 108dp x 108dpで作成する
  • 内側の72dp x 72dpのエリアが表示される(アイコンが静止している状態)
  • 中央から直径66dpのエリアはセーフゾーン。このエリアはクリップされることはない

作成手順

  1. アダプティブアイコンを作成する
    1. フォアグラウンドのSVGを作成
    2. バックグラウンドのSVGを作成
  2. それぞれをAndroidStudioでVectorDrawableとして取り込み、drawableファイルを作成。
  3. AndroidManifest.xmlで作成したdrawableを指定

1. アダプティブアイコンのためのアイコン作成

アダプティブアイコンを作成していきます。私はお金がないので、無料のベクターソフトの「Vectr」を使って、作成してみます。もちろんIllustratorなどSVGで吐き出せるソフトであれば、使用可能です。

Vectrについて

https://vectr.com/

軽くVectrについて説明していきます。私も素人なので、あまり深い説明はできませんが、わかる部分のみ紹介していきます。

VectrはWeb上で使用できるベクター編集ソフトウェアになります。基本的にはAdobeのIllustratorなどを使って作成する例が多く見られますが、こちらのようなSVGで書き出せるエディタでも作成することが可能です。

アイコンを作成する

今回は個人的に作っていた、はてなのRSSリーダーアプリを使ってアダプティブアイコンを適用してみましょう。

このように左側に表示されているのがアイコンのもととなるPageになります。
上が「foreground」、下が「background」のPageになります。

細かい作成の仕方は省略します。詳しくご覧になりたい方は、「Vectr」が公式に公開しているUserGuideやTutorialがあるのでこちらが参考になりそうだと思いました。
UserGuide | Vectr
Tutorials | Vectr

アイコンを作る際に注意すべき点としては、ちゃんと上記の直径66pxの円形の枠に収まっているかどうかを考えながらアイコンの大きさや形を調整することだと思います。

2枚の画像をSVGとしてエクスポート

上記の画像をエクスポートします。エクスポートはSVGで行い、backgroundとforegroundそれぞれ出力します。
ここで確認すべきは形式がsvgになっているかという点と、widthとheightが108pxになっているかという点です。

2. Android StudioでVectorDrawableとして取り込む

svgファイルを出力したら、2つのsvgファイルをVectorDrawableとしてAndroidStudioで取り込みます。

foreground画像を取り込む
background画像を取り込む

3. adaptive-iconのdrawableを作成する

画像を取り込んだらadaptive-icon用のdrawableを作成します。
adaptive-iconはAPIレベル26から使用可能なので、res/mipmap-anydpi-v26に作成します。

res/mipmap-anydpi-v26/ic_launcher.xml
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
    <background android:drawable="@drawable/ic_background" />
    <foreground android:drawable="@drawable/ic_foreground" />
</adaptive-icon>

4. AndroidManifest.xmlで作成したdrawableを指定する

drawableを作成したらandroid:icon属性に作成したdrawableを指定します。

AndroidManifest.xml
<manifest>
    <application
        android:name="youmeee.co.jp.hatenarssreaderapp.App"
        android:icon="@mipmap/ic_launcher">
    </application>
</manifest>

フォルダ階層は↑のようになります。これで、Oreo以上の端末ではアダプティブアイコンが適用され、それ未満の場合は既存のmipmapのフォルダにあるic_launcher.pngが適用されます。

5. ビルドして確認

エミュレータ(APIレベル26)で確認した結果になります。いい感じにアダプティブアイコンが適用できています。

まとめ

正直AdaptiveIconに対応していなくても騒がれることは少ないですが、対応しているのとしていないのとでは受ける印象がだいぶ変わってくるのかなと思っています。そのためアプリへのエンゲージメントに響くこともあると思うので、是非対応していきたいところです。
また、今回は無料のオンライングラフィックエディターの「Vectr」を使ってみましたが、非デザイナーの私も簡単なものであれば、作成できることがわかったので個人的に作るアプリでは今後も使っていきたいと思いました。
最後までご覧いただきありがとうございました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CardViewの子要素をハミ出そうとした話

やろうとしたこと

androidx.cardview.widget.CardViewのCardViewの中身のviewをネガティブマージンを使って外の領域まではみ出そうとした。

結論

CardViewを使うのをやめて、FrameLayoutで対応した。

検証

まずCardViewで試す

まずCardViewの子Viewに対してネガティブマージンを設定することによって、cardviewから領域をはみ出そうとした。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipChildren="false"
    android:clipToPadding="false"
    android:padding="40dp"
    tools:context=".MainActivity">

    <androidx.cardview.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@color/colorPrimaryDark">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:layout_marginLeft="-8dp"
            android:layout_marginRight="-8dp"
            android:background="@color/colorAccent"
            android:text="Hello World!" />

    </androidx.cardview.widget.CardView>

</RelativeLayout>

レイアウトのプレビューは以下のようになっていました。おっハミ出てる!いい感じ!

しかしビルド後

なぜだ、、はみ出ているべき領域がクロップされている。。

FrameLayoutで試す

原因究明のため試しにFrameLayoutでやってみる。レイアウトは以下。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipChildren="false"
    android:clipToPadding="false"
    android:padding="40dp"
    tools:context=".MainActivity">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#FF424242">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:layout_marginLeft="-8dp"
            android:layout_marginRight="-8dp"
            android:background="@color/colorAccent"
            android:text="Hello World!" />

    </FrameLayout>

</RelativeLayout>

プレビューはこんな感じ。うん、さっきと同様ちゃんとハミ出てる。

ビルド後

ちゃんとはみ出た!やはりCardViewの何らかの処理が原因っぽいが、コードを見てもそれらしき処理は見つけられず。。
なんとなくelevationとかが影響してそうかと思いましたが、cardElevation属性を0にして試しても同様にはみ出すことはできませんでした。

まとめ

今回はCardViewでなくても実現できるUIだったので、CardViewの採用をやめ、FrameLayoutで対応しました。
CardViewの子Viewを飛び出したい場合(あまりないと思いますが)は要注意です。

一応リポジトリはこちらです。
https://github.com/youmitsu/ClipChildrenSampleApp

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

めっちゃ需要あるのにAndroidエンジニアが足りてないらしいから魅力とか紹介する回(配信用カンペ)


自己紹介

  • バーチャル幼女プログラマーのきりみんちゃんです
  • フリーランスのAndroidアプリ開発エンジニアをやってます

今日のおはなし

  • Androidエンジニアが足りてないらしいよ!!

  • 需要はめっちゃあって観測範囲だとわりとどこの会社もAndroidエンジニア探してる印象
  • 特に足りてないのはわりと勉強会とかブログとかで積極的にアウトプットしたりするような意欲の高いタイプの人
  • 当分はかなり需要が共有を上回る感じなので転職有利だと思うし、やる気があれば新人でも育ててもらえるかもしれない
  • 今だとお給料も高めだと思う

原因考察


  • 開発されるアプリの規模や要求される品質は上がり続けてて需要は増えている

  • ぶっちゃけあんまり若い層が育っていないような
  • 勉強会とかカンファレンスとかわりとモバイル開発が流行り始めた頃に参入した層から界隈のメンバーがあんまり変わってない感じ
  • ブームの頃に始めたシニア層のAndroidエンジニアもわりとAndroidに飽きて別の仕事し始めたりマネージャーになったりしてきてる

  • 多分数学とかCSガチガチの人は機械学習とかの方に行ってるし、そこまでじゃない人は普通にJavaとかRailsのサーバーサイドに行ったりしてる
  • Androidは機械学習や大規模サービスのバックエンドとかほどは高度な技術は要求されないけど、わりとどんどん新しいバージョンやライブラリなどが出てくるので勉強はし続けないとやっていけない

iOSエンジニアの方が若い人が多くいる印象

  • プログラミングに興味持って独学した意識高い学生とかはiPhoneユーザーが多いのでモバイルから入ってもiOS(Swift)の方に行きがちな気がする

Androidエンジニアのお仕事

  • Android向けアプリを作るよ
  • BtoBもあるけど、BtoCの一般ユーザー向けアプリが多い
  • 大きく受託開発と自社プロダクト開発に分かれると思う
  • 受託は初期の頃よりも減ってきてるかもしれない(単純なアプリというのは作られ尽くした感あるので)
  • 自社プロダクト開発は相変わらずたくさんあるし、今後もそんなに減ることはないと思う(スマホ自体が廃れなければ)
  • スタートアップとかメガベンチャーがわりと多いかも

仕事の内容

  • 開発はAndroidStudioというIDEを使う
    • これはIntelliJという人気のIDEからフォークされたものなのでかなり使いやすい
  • 開発言語はJavaかKotlin
    • 最近は新規開発ならKotlin一択、既存で大きいアプリならまだJavaの案件も多いかも
  • アプリエンジニアは一般的に、ある機能に対して求められた仕様やデザインから、設計や実装方法を考えて、実際に実装して、動作確認してリリース(アップデート)するところまで一人で全てやることが多い
    • なので、案件のわりと最初からユーザーに届くところまでずっと関わることが出来る
  • 最終的に仕様やデザイン、APIが全部乗るのがアプリなので、PMやデザイナー、サーバーサイドエンジニアなど案件の関係者を積極的にコミュニケーションしていくことが多い

Androidエンジニアの魅力

  • ユーザーが直接動かすフロントの機能を作れる
    • 「この画面は自分が作った!」という達成感を感じやすい
    • 案件の最初から最後まで関われる
  • モダンで使いやすい言語Kotlinで開発が出来る
  • 開発環境、ビルドスクリプトやレイアウトの組み方などが洗練されていて自由度が高く開発しやすい
  • コミュニティが育っていて、DroidKaigiや定期的な勉強会など最新技術や知見を共有し合う文化が強い
  • 世界的にはiOSよりAndroidの方がシェアが大きく今後更にAndroidのシェアが広がっていくといわれている
  • 国内でも世界的にも需要は高いし、最新技術をキャッチアップ出来ていればスキルとしてかなり強い
  • 最近はサーバーレスでのアプリ開発や、モバイル環境でのオフライン機械学習の技術とかも出てきてるし、モバイル開発が出来ると他のスキルとの親和性も高い

求められるスキル

(それなりのレベルの会社で期待されること)


Android開発の基礎知識

  • マテリアルデザインに対応した一般的なアプリを一人で0から開発出来る
  • ライフサイクルの理解や、Intent、Fragment、Service、RecyclerViewなどなど
  • ハードウェアにアクセスするような機能や汎用的じゃないような機能の実装方法などは無理に全て暗記しなくても都度ググるでもいい(わりとよく仕様変わるし)

JavaとKotlinの知識

  • 最低でもAndroid開発が普通にできるレベル
    • Javaの言語仕様一通りとEffectiveJava、Kotlinの言語仕様一通りくらい
  • 最近だとKotlinのコルーチンとかが普及しつつある

デファクトスタンダードになっているライブラリの使い方

  • OkHttp、RxJava、Retrofit、Dagger2など
  • 案件によって使ってるライブラリは色々なので必要に迫られてから覚えても太刀打ち出来ないというわけではない

公式ライブラリの知識

  • DataBinding、AndroidArchitectureComponents(AAC)、JectPackなど
  • まだ完全に普及仕切ってるというわけではない、知っていたら好印象くらい

設計に関する知識

  • MVP、MVVM、CleanArchitectureなどをAndroidで実装するパターンに関する知識
    • Androidアプリ設計パターン入門という本を読もう
  • なぜMVVMなどの設計が流行って、どういうところがメリットなのか、という部分が理解出来て議論が出来るレベルが期待される
    • 過去のカンファレンスや勉強会の資料などを漁ってみよう

コミュニケーション、人柄

  • 正直一定以上の技術力よりも重要だと思う
  • きちんと自分の考えや状況などを説明できる能力
  • アプリの開発だけではなくプロダクトや組織全体のことを意識して働けるか
  • エンジニアチームメンバーやプロジェクトのメンバーとピリピリせずスムーズに会話出来、率先してリスクを伝えたり妥協点を相談したり出来る能力
    • 個人的にはめちゃくちゃプログラミングが天才的でいつもイライラしてる人よりも、技術的には普通だけど話しやすい人と仕事がしたいしその方が上手く回ると思ってる

新しい技術を積極的に学ぶ意欲

  • 毎年新しいAndroidのバージョンと仕様変更が発表され、公式でもサードパーティでも新しいライブラリやツールなどがどんどん出てくることに興味を持って楽しいと思えるか
  • 多少個人の時間を使ってでもそういうものを研究して登壇したりする意欲があるか

おわり!

  • Androidやろうよ!!!!

https://www.youtube.com/watch?v=bxzpqyWJanc

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む