カテゴリーアーカイブ Java

asaba 著者:asaba

【androidjava】scrollviewを初めて使ってみた

androidのアプリを作っているとどうしても要素が多くなってきて縦長になってしまう

時があります。

今使っているrelativeLayoutはデフォルトではスクロール機能がついておらず、今回のお題の

scrollviewというコンポーネントを付けないとスクロールしてくれないみたいです。

さてscrollviewの使い方ですが、単純明快超シンプルでスクロールしたいレイアウトを

<scrollview></scrollview>で囲むだけ。

 

</pre>
<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"
android:background="#C0C0C0"

<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/scrollView">

<RelativeLayout
android:id="@+id/relativeLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints">

//ここにレイアウトを入れていく

</RelativeLayout>

</ScrollView>

</android.support.constraint.ConstraintLayout>
<pre>

未だレイアウトに手を焼いている自分でもさくっと使えたのでlinearlayoutや

relativelayoutでレイアウトを構築している方にはおすすめです。

 

最後に自分はレイアウト作成はxmlで書いているのですが、ConstraintLayoutで普通に制約バリバリつけて自由に

レイアウト作っている人を見ると本当に尊敬します。柔軟なレイアウトが作れる

魔法使いになれるよう力を付けたいと思います・・・。

 

  • この記事いいね! (0)
asaba 著者:asaba

【android】エラー:Error:No such property: GradleVersion for class: JetGradlePluginについて

Error:No such property: GradleVersion for class: JetGradlePluginというエラーに遭遇。

こちらは現在のgradleバージョンに対してandroidStudioのバージョンが低くgradleのプラグインが使えない

ことで起きたエラーです。解決方法は、最新のandroidStudioをダウンロードして終了という

至ってシンプルな感じです。

まず、help->check Updataをクリックすると以下のダイアログが出てきます。

 

 

last checkedがアップデート可能なandroidStudioのバージョン、Current versionが

現在使っているandroidStudioのバージョンになります。

ここではそのままOKを押します。特にこだわりがなければデフォルトのままアップデート

を進めてしまっても構いません。

終了ダイアログを押すとandroid Studioが自動で再起動するので外観が変わったか

どうか確認してみてください。

一緒にError:No such property: GradleVersion for class: JetGradlePluginが消えていることが

確認できれば成功です。

これで他のエラーが出ていないことが確認できれば従来通りandroidStudioを使うことができます。

今まで自分はアップデートするとエラー増えそうだとか要らないファイルがダウンロード

されて煩わしそうだとか勝手に悪いイメージを抱いていたのですがまあ以外に優しかったです。

同じエラーで悩んでいる人は試してみてください~。

  • この記事いいね! (0)
asaba 著者:asaba

【android】onItemClickで動的にリストを削除する方法

ListViewを組み立てるときに一緒に使うonItemClick関数ですが、叩く時にアクションを起こす方法は

知っていたのですが決められたリストを削除する方法はまだ調べたことが無く、ついこの間その方法を

見つけたので忘れないうちに収めときます。

以下構文になります。

 


myAdapter = new MyListAdapter(this);
    lv = (ListView) findViewById(android.R.id.list);
    lv.setAdapter(adapter);
    lv.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView<?> a, View v, int position, long id) {
        final int positionToRemove = position;
                MyObject.remove(positionToRemove);
                myAdapter.notifyDataSetChanged();
        }
    });

onclickで特定のリストを叩くまでは同じなのですが、ここでは第三引数のpositionを一度int変数に格納します。

その後オブジェクト.removeを使い先ほど格納したpositionToRemoveを指定します。

adapter.notifyDataSetChanged();で、リストを更新。リストの値が変更されたことが確認できれば

成功になります。

よく考えたらめっちゃ簡単でしたね・・・。

※notifyDataSetChangedの前にclear()しないとエラーになるみたいですがこちらでは確認できず。

このコードで動作したのでとりあえず間違いではないと思います。

出典↓

notifyDataSetChanged()でListViewが更新されない

  • この記事いいね! (0)
村上 著者:村上

【Android】複数のパーミッションをリクエストする方法

毎回書き方を忘れてしまうので、備忘録としてまとめます。
Android のアプリで、複数のパーミッションをリクエストする方法です。

今回参考にさせていただいた記事はこちらから。

Androidのパーミッションリクエスト(複数)- Qiita
https://qiita.com/tcb78/items/fd2e16eb7f1eacd0ba26

 

早速ですがコードは下記のとおりです。
onCreate() 内に下記を記述します。

private final int REQUEST_CODE = 1000;

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

    // Android 6, API 23以上でパーミッションの確認
    if(Build.VERSION.SDK_INT >= 23) {
        String[] permissions = {
                Manifest.permission.WRITE_EXTERNAL_STORAGE,
                Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.ACCESS_FINE_LOCATION
        };
        checkPermission(permissions, REQUEST_CODE);
    }
    // メインの処理を記述
}

なお、今回は位置情報とストレージへのアクセスをリクエストしています。
REQUEST_CODE の定義を忘れないように気を付けてください。私はよく忘れます。

次に、checkPermission() を下記のように定義します。

public void checkPermission(final String[] permissions,final int request_code){
    ActivityCompat.requestPermissions(this, permissions, request_code);
}

上記の処理を実行すると、許可されていないパーミッションのみリクエストされます。

最後に、onRequestPermissionsResult()requestPermissions() のコールバックを受け取ったときの処理を定義します。

@Override
public void onRequestPermissionsResult(int requestCode,
                                       @NonNull String[] permissions,
                                       @NonNull int[] grantResults) {

    if (requestCode == REQUEST_PERMISSION) {
        for (int i = 0; i < permissions.length; i++) {
            if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
         // パーミッションが許可された
               Log.d("Permission", "Added Permission: " + permissions[i]);
            } else {
                // パーミッションが拒否された
                Log.d("Permission", "Rejected Permission: " + permissions[i]);
            }
        }
    }
}

もし必要であれば、パーミッション別にリクエストが許可/拒否されたときの処理を記述することもできます。
状況に応じて追加してください。

追加するコードは以上です。
あとは、設定からパーミッションの許可を無効にするか、アプリをアンインストールしてから再インストールして実行すると、パーミッションリクエストのダイアログが表示されることが確認できると思います。

 

以上、Android アプリで複数のパーミッションをリクエストする方法でした。
困ったときは、是非コピー&ペーストしてご活用ください。

  • この記事いいね! (0)
村上 著者:村上

【Android】LinearLayoutで囲んだページをスクロールさせる方法

Android アプリを修正中に、LinearLayout で囲った要素をスクロールさせたかったので、その対処法です。
…というか、LinearLayout って要素がいくら増えてもスクロールしない仕様なのですね。
今後もうっかりこの仕様を忘れて「あれ?」となる未来が見えそうなので、忘れないようにしなければ。

今回参考にさせていただいた記事はこちらから。

LinearLayout をスクロールさせる方法(ScrollViewの使用方法) – [サンプルコード/Androidアプリ] ぺんたん info
http://pentan.info/android/app/sample/linear_scroll.html

 

対処方法としましては、スクロールさせたい LinearLayout を ScrollView で囲むだけです。
サンプルコードは下記のとおりです。

<ScrollView
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_height="fill_parent"
  android:layout_width="fill_parent">
  <LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <!-- 表示したい要素 -->

  </LinearLayout>
</ScrollView>

XMLファイルに記述する場合、上記のようにすれば、ページをスクロールすることができます。

なお、参考サイトでは、Activity のファイルで指定する方法についても掲載されておりますので、お好きな方法を採用してください。
個人的には、XML ファイルに追加する方法の方が楽だし分かりやすいと思います。

使用する際の注意点としましては、ScrollView は指定する子要素が 1つでなければいけないということが挙げられます。
なので、複数の要素をスクロールさせたい場合は、LinerLayout などのレイアウト要素を用いて、複数の要素を 1つにまとめる必要があります。

また、上記の方法では縦スクロールが有効になりますが、もし横スクロールを行いたい場合は、ScrollViewHorizontalScrollView に変更してください。

 

以上、Android の LinerLayout をスクロールさせる方法でした。
皆様は、私のようにうっかり仕様を忘れてしまわないようにご注意ください。

  • この記事いいね! (0)
村上 著者:村上

【Android】「Could not find com.android.tools.build:aapt2:3.4.2-5326820.」エラーの対処法

1年ほど前に開発したアプリを起動した際に遭遇したエラーについてです。
エラーメッセージは「Could not find com.android.tools.build:aapt2:3.4.2-5326820.」というもので、これだけでは意味が分かりません…。
なので、そのまま Google 検索にかけたところ、下記の記事がヒットしました。
若干エラーメッセージが異なりましたが、こちらの対処法で解消できました。

参考にしたサイトはこちら。

[Android]「Could Not Find com.android.tools.buildaapt2:3.2.0-4818971」という謎のエラーが出てビルドできない場合の対処法
https://minpro.net/could-not-find-com-android-tools-buildaapt2

 

こちらの記事によると、Android Studio のバージョンを挙げた時に発生するエラーのようです。
確かに、開発した当時とは Android Studio のバージョンは異なっているはずです。

で、解決方法ですが、build.gradle の中に google() を追加すればOKです。
追加箇所は下記のとおりです。

...
allprojects {
    repositories {
        google()  // こちらを追加
        jcenter()
    }
}
...

あとは、build.gradle を更新したので、Sync Now を実行し、通常通りビルド・実行をします。
私の環境では上記の追加のみで解決できました!

なお、こちらのエラーの原因ですが、参考サイトによると「Android Studio が 3.2 にバージョンアップされたとき、「AAPT2」というツールの提供元が変更されたことが原因」とのことでした。

 

以上、Android Studio にて「Could not find com.android.tools.build:aapt2:3.4.2-5326820.」エラーが発生した時の対処法でした。
参考になれば幸いです。

  • この記事いいね! (0)
村上 著者:村上

【Android】「Failed to validate the certificate chain, error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.」エラーの対処法

先日報告があったため修正した、Android アプリの不具合です。
WebView のページを開いたところ、何も表示されず真っ白なページになってしまいました。

で、Android Studio で表示されたエラーメッセージは、タイトルにもある通り「Failed to validate the certificate chain, error: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.」というもので、「証明書チェーンの検証に失敗しました」とのこと。

このエラーは証明書の設定が間違っていることが考えられるので、一度証明書の設定を確認してください。

 

ですが、テスト用の証明書だったりするなど、直すのが難しいことがあるかと思います。
そんな時には、強制的にエラーをスキップする方法があります。

参考にしたサイトはこちらから。

Y.A.M の 雑記帳: Android WebView で https のサイトにアクセスして白画面になるのを避ける方法
http://y-anz-m.blogspot.com/2012/08/androidwebview-https.html

ssl – Android error in webview.loadUrl() – Trust anchor for certification path not found – Stack Overflow
https://stackoverflow.com/questions/33825696/android-error-in-webview-loadurl-trust-anchor-for-certification-path-not-fou

ただし、セキュリティ上は問題があるので、なるべく使わないほうがいいです。
あくまでも、緊急時の対処法ということにしておいてください。

対応方法ですが、WebViewClient を継承しているクラスがあると思うので、そこに下記のコードを記述します。

@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError er) {
    handler.proceed(); 
}

上記を指定すると、SSL でエラーが発生しても無視をしてくれますので、問題のあるWebページでも問題なく表示されます。

 

以上、Android の WebView で SSL 証明書にエラーがある Web ページを表示する方法でした。
ただし、再度繰り返しますが、あくまでも応急処置ですので、リリースするアプリには導入しないことをお勧めします。

  • この記事いいね! (0)
asaba 著者:asaba

【java】HasuMapを使ってキーと値を一緒に取得する※自分用

javaにはphpのようにforeachで回す手段が無く、代わりに拡張for文を使ってキー・値を取得する方法が用意されています。

例えば、hasumap配列に格納したキーと値を取り出すには以下のようにentrySet・getKey・getValueを使って取り出すことができます。

</pre>
import java.util.HashMap;
import java.util.Map;

public class Main {

public static void main(String[] args) {

Map<String, String> map = new HashMap<>();
map.put("name", "asaba");
map.put("job", "programmer");

for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
}
}
<pre>

hashmapを使う時はimportでimport java.util.HashMap;とimport java.util.Map;と定義しないとno such no fileのエラーが

出るのでそこは注意しなければですね。

片方だけ取ってくる方法も存在するのでそこは作りたいものに合わせて調整する必要があります。(簡単ですが)

  • この記事いいね! (0)
asaba 著者:asaba

【java】javaにおけるコンストラクタの使い方・おさらい

javaでコンストラクタの使い方がわかってきてもう怖いものはないと思っていましたが、いずれまたすぐ忘れるかもなので自分用に

とっておきます。コンストラクタは、インスタンスを作る時に初期値を設定するために呼び出されるメソッドのことで、クラス名と

必ず同じ名前でなければなりません。また、コンストラクタのメソッド内でreturnを書いても死ぬのでここも注意ですね。

知らないうちはそんなのメンバ変数を適当に定義しとけばいいじゃんと思っていましたが、コードが大きくなるにつれ結局メンテナンス

が大変になって汚いコードになることを知ったのでまた使い方をおさらいしていたところです。理屈で知っていても何のために使う

か実際に書いて理解していないとわかったつもり状態になってしまうのでここにきてサンドボックスで少し復習しました、はい。

次のプログラムは、コンストラクタのメソッドに決められた文字を設定して、superでスーパークラスのコンストラクタを利用して

それぞれ異なる結果を出力するプログラムです。

 

</pre>
// スーパークラス
class ClassSuper {
protected int i;

public ClassSuper(str i){
this.i = i;
}

public void favarite(){
System.out.println("私は" + i + "が好きではありません。");
}
}
// サブクラス
class ClassSub extends ClassSuper{
public ClassSub(str i) {
super(i);
}

@Override
public void favarite(){
System.out.println("私は" + i + "が好きです。");
super.favarite();
}
}

public class Main {

public static void main(String[] args) {
ClassSub cs = new ClassSub("カレーライス");
cs.favarite();
}

}
<pre>

コンストラクタにカレーライスという文字を設定しています。何も設定しない場合は、スーパークラスをオーバーライドしている

サブクラスのメソッドを呼び出すのですが、今回はコンストラクタメソッド内でsuperメソッドを呼び出しています。このsuperメソッド

は、オーバーライドしているサブクラスのメソッドでないスーパークラスのメソッドを使いたい時に用いるメソッドです。

これを呼び出すことにより、”カレーライス”文字列はスーパークラス・サブクラス二つのクラスのコンストラクタとして初期値に設定され

それぞれ違うメソッドを呼び出すことに成功しています。

 

 

  • この記事いいね! (0)
asaba 著者:asaba

【java】オーバーロードを使ったポリモーフィズムの書き方

今回は、ポリモーフィズムの話題です。

ポリモーフィズムとは、定義された同じ名前のメソッドを使ってクラスごとに全く違う振る舞いを

入れこむことができる概念で、、多様性という意味を持ちます。

今回は、オーバーロードの書き方に沿ったポリモーフィズムをさっと書いてみました。

※「オーバーロード」とは、一つの「クラス」の中に、同じ名前で引数が違うメソッドがある状態のことを指します。

このオーバーロードに沿って簡単な計算をするプログラムを書くとこんな感じに仕上がります。

</pre>
<pre>class calculator{
  public void calc(int x) {
    System.out.println("x * x = " + (x * x));
  }
  public void calc(int x, int y) {
    System.out.println("x * y = " + (x * y));
  }
}

class plusCalc{
  public static void main(String[] args) {
    calculator hoge = new calculator();
    hoge.calc(int 4,2)
    hoge.calc(int 2)
}
</pre>
<pre>

スーパークラスcalculatorのインスタンスを定義してcalcメソッドを使用可能にしています。その後に

引数が異なるメソッドを二つ定義しているのがわかります。ここの引数が異なるのがポイントで、

引数によってどのメソッドに処理をさせるかを識別してからメソッドを呼び出しています。

この識別されるメソッドと引数を全部ひっくるめてシグネチャと呼びます。

オーバーロードをこのポリフォーリズムの書き方に当てはめることで、このシグネチャによって

どれだけ同じメソッドを書いても引数によってその処理を柔軟に変えることが出来るのです。

以上です。

オーバーライドを使ったポリモーフィズムもあるのですが、うろ覚えで自信がないのでまたまとまった時に書きます。

  • この記事いいね! (0)