ライブラリでトラブった時に、とりあえず依存関係を確認する。
./gradlew dependencies
Javaと似てて、末尾に ... を追加するだけ。参照する際は、配列と同じように扱える。
func print(texts: String...) {
// 配列のように要素数を参照できる
if texts.count == 0 {
return
}
// 配列のように要素を参照できる
print("first: \(texts[0])")
for text in texts {
print("element: \(text)")
}
}
このブログの表示感を調整するためにCSSをカスタマイズしていたが、毎回調べなおしていたので備忘録。
widthdivで頻出。heightdivで頻出。background-colorfont-sizepx,emとか。larger/smaller
(親要素のフォントサイズとの相対)とか。
colorfont-stylenormal/italic/obliqueとか。
paddingpx,em指定。marginpx,em指定。list-styleul)限定。左につくボッチの指定。noneを指定すると消える。border-stylesolid(実線),dashed(破線)など。border-widthpx, em指定。border-colorborderborder-style, border-width,
border-colorを一括で指定できるプロパティ。
ViewのプロパティであるisHighlightedの更新を受けて、背景色を設定するだけ。
カスタムViewを実装する際に、isHighlightedをオーバーライドし、didSetでbackgroundColorを設定すればいいだけ。こんなん。
override open var isHighlighted: Bool {
didSet {
backgroundColor = isHighlighted ? .lightGray : .blue
}
}
ちなみにisHighlightedとは、Androidでいうところのstate_pressed。UIButtonなどのUIControlクラスを継承したViewは状態に対して背景を変えるメソッドがあるため、それを使えばタップ中の色を変えることができる。
どうも。どっことです。今回は、iOSのUIViewについて角丸や枠線をつけ方について実装を解説していきたいと思います。
私自身がAndroidエンジニアとしてやってきた時間が長いので、どうしてもAndroid開発者目線となってしまうのですが、Viewを角丸にしたり、枠線をつけたりする実装が本当に面倒くさいです。簡単に見せるだけでも、新規に背景用ファイルを用意してあげる必要があります。
しかし、iOSは角丸や枠線を超簡単に実装できます。本当に羨ましいです。別に悔しくねーし。
UIViewが共通に持っているlayerという変数に対応するパラメータがあるので、コード上であれば以下に値を設定することで角丸にすることができます。
layer.cornerRadius
枠線の実装も同様で、以下に値を設定することで枠線を付けることができます。
layer.borderWidth
layer.borderUIColor
ちなみに、borderUIColorは
CGColorクラスを設定する必要があることに注意してください。
今回は、UIViewを角丸にしたり枠線をつけたりする実装方法を解説しました。特に見せ方を柔らかくする角丸の実装が簡単なのは、iOSはとても良いなと思いました。
targetSDKVersionをAndroidP以上に設定すると、セキュリティの問題でアプリでのhttp通信が失敗する。AndroidManifest.xml のapplicationタグに以下の属性を追加する。
<application
....
android:usesCleartextTraffic="true">
</application>
開発段階ではローカル環境にサーバ立ててそこにスタブデータを置いて動作確認することが多いが、本番環境では回避すべき設定なので、debug/releaseでAndroidManifest.xmlを分けるなど、きちんと切り分けること。
マウスオーバーしたときに表示を切り替えたいときは、CSSに疑似クラスを指定する。
a:hover {
マウスオーバー中に表示したい内容
}
この指定を複数の要素に指定することで、例えばテキストやイメージの表示切替などもできる。
a:hover {
マウスオーバー中に表示したい内容
}
.a-covered:hover {
マウスオーバー中に表示したい内容
}
マウスオーバー以外にも疑似クラスの指定により表示を変えられるものは以下。
Logcatとかコンソールでログとか漁ってるときに、「必要なところを探して、必要な所だけくり抜くのマジだるい…」ってなる。
正規表現を使えば簡単なんだけど、「必要な所だけくり抜く」表現がわからなかったので放置してた。でもいい加減(ちゃんと書ければ秒で済む話を何時間もかけて作業してるの、マジ無能…と思い)なんとかしたかったので、調べて備忘録として残す。
知ってしまえば本当に簡単なんだわ。
(検索したいけど置換したくない文字)なにかしら置換したい文字(検索したいけど置換したくない文字)
$1置換後の文字$2
ポイントは
検索での表現
<(/*)div>
divを指定する。/があるかないかは、置換後のテキストにも影響するので、()で書く。
*は0文字以上の意味。置換での表現
<$1p>
pタグを指定する。()で書いた箇所が$1として置換後のテキストに反映される。/があった場合に限り置換後に/が入るようにする。
メソッドの上部で option + command + / を入力すると、自動でドキュメンテーションコメントが追加されます。
あとで見返すときのために、「何をするメソッドか」「引数にはどんな値が必要か、どういう値が想定されているか」「戻り値は何か」などを記入しておきましょう。
Androidでは、String.format(text, value)としてテキストを出力させるが、iOSの場合もほぼ同じでStringのコンストラクタに入れるだけ。
let number = 3
let numberString = String(format: "%03d", number) // 003
毎回毎回、
署名キー探して、
設定値を入力してビルドして
aabファイル生成して
プレイストアにアップロードして
ってフローが面倒になった。どうにかならないものか。
少なくても、署名キー探す~aabファイル生成するまでを自動化できることは知っているけど、例えばGitHubActionでやるなら生成したaabファイルや署名キーを秘匿にしないといけない都合でリポジトリも秘匿にしないといけないし、でもそれを秘匿にするのは正直あまりうれしくない(できるだけパブリックにしておきたい)。どうにかならないものか。
って考えたときに、「ソースを管理する領域(GitHub)とaabファイル生成をする領域を別にすればいいんじゃん。そうすればソースはパブリックのままでいいし、署名キーやら生成したaabファイルやらも秘匿の状態を保てる。とても幸せやん。」と気づいた。
上記を整理すると以下のフローとなる。
素敵だ。上記フローを実現するために必要な調査は★1,2の内容。
まあ、「そんなのありません」ってことはないんだろうけどね。特に★1については「サービスとしてはあるけど、有料会員様限定のサービスなんすよ」かもしれないし。
というわけで、考えていることでした。調査した結果とか、更新があればまた改めて投稿します。
どうも。どっことです。今回はXML上でクリックリスナーを設定する実装方法について解説します。
dataBindingでは、XMLでクリックリスナーを設定する処理はよくある実装ですが、実はdataBindingを使わない通常のケースでも似たような実装をすることができます。
XMLでクリックリスナーを設定するには、任意のViewに対して
android:onClickを設定してあげます。たとえば、TextViewに設定するときは以下のような形です。
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="テスト"
android:onClick="testClicked" />
あとはこのXMLを読み込むクラスに、testClicked(View v)関数を実装します。
override fun testClicked(v: View) {
Log.d("TAG", "TextView テスト is clicked")
}
今回設定したonClickの値はtestClickedなのでそれに合わせていますが、実際に利用する際はTextViewがどんな表示をしているかなどを表現した関数名にしてあげると後々にコードを追いやすくなるかと思います。
今回はXMLでクリックリスナーを設定する実装方法について解説しました。dataBindingでも似たような実装方法があると思いますが、そうでなくてもシンプルに利用することができるので、参考にしていただけると幸いです。
親の領域を基準に特定の要素の位置を決める、AndroidでいうところのRelativeLayoutな位置調整をしたかったので実装方法を調べた。
position:relative
position:absolute
上記を設定したら、あとは特定の要素に対してleft,top,right,bottomを指定すればOK。特にやりたかった右下を指定する場合は以下。
right:0
bottom:0
android:textColorに設定する場合は以下。
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="#aaa" />
<item android:state_selected="false" android:color="@android:color/transparent" />
</selector>
一方で android:background に設定する場合は以下。
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" >
<color android:color="#aaa" />
</item>
<item android:state_selected="false">
<color android:color="@android:color/transparent" />
</item>
</selector>
どうも。どっことです。今回はアプリ固有のファイル領域にディレクトリを生成する実装方法を解説します。
さっそくですが、実装サンプルです。階層構造のあるディレクトリを生成するケースとして、階層ごとに生成するケースとまとめて生成するケースを紹介します。
階層ごとに生成するケースを紹介します。最初にディレクトリを生成したあと、そのディレクトリを親ディレクトリとして指定する形で子ディレクトリを生成します。
val parent1 = File(requireContext().filesDir, "parent1")
// ディレクトリ(parent1)を作成する
parent1.mkdir()
val parent2 = File(parent1, "parent2")
// 作成したparent1ディレクトリを親にして、子ディレクトリ(parent2)を作成する
parent2.mkdir()
こちらはまとめて生成するケースです。ディレクトリ名の指定に親ディレクトリを含めることで、その親ディレクトリもまとめて生成してくれる。というわけです。唯一注意が必要なのは、ディレクトリを生成する関数が前のサンプルではmkdir()をつかっていましたが、今回はmkdirs()を使っている点でしょうか。
val parents = File(requireContext().filesDir, "parent1/parent2")
parents.mkdirs()
class Sample {
Sample();
}
class Sample {
final String value;
Sample(this.value);
}
class Sample {
final String value;
Sample({this.value = "initial string"});
}
class Sample {
final String? value;
Sample({this.value});
}
何も考えないなら以下をコピペして呼び出す。
static void showDialog(BuildContext context, String title, String content, String positiveButton, String negative,
{VoidCallback? onPositiveButtonPressed, VoidCallback? onNegativeButtonPressed}) {
showDialog<int>(
context: context,
barrierDismissible: true, // キャンセル
builder: (BuildContext context) {
return AlertDialog(
title: Text(title),
content: Text(content),
actions: [
TextButton(child: Text(positiveButton), onPressed: onPositiveButtonPressed),
TextButton(child: Text(negative), onPressed: onNegativeButtonPressed)
]);
});
}
どうも。どっことです。 タイトルの通りですが、諸事情により GitHubPage に移行予定です。 https://mkt120.github.io/ この備忘録に記載の内容を転記しつつ、今後はこちらのページを更新していく予定です。