Unknown Region

プログラムでハマったエラーとその解決方法についての備忘録メモ

【Android】ConstraintLayoutを使用時にbuttonが常に最前面に配置される問題

ConstraintLayoutを使用時に、ButtonがViewの追加順やaddView時のindexの値をガン無視して最前面に表示される問題に直面。

原因を探していたら、以下のリンクを発見。

z order in issue in ConstraintLayout Android - Stack Overflow

どうやらAPIレベルがLolipop(API 21)以降で、デフォルトで最前面にボタンが配置されるしようとなっているらしい。

上記の解決策に従って以下のコードを追加したら適切にボタンが表示されるようになった。

 

コード(Kotlin)

val button: AppCompatButton = AppCompatButton(context)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    button.stateListAnimator = null
}
constraintLayout.addView(button)

ただしaddViewをしたあとでstateListAnimatorにnullを突っ込んでもうまくいかない場合があり、これがどういうことなのかは不明。

きっとAndroidのライフサイクル的な問題なんじゃないかと思っている。

 

【Perl】テキスト中の特定文字目をハイライトする

MacLinuxのコンソールにおいて、以下の方法で標準出力を加工できる。

\[(属性)m hogehoge \e[m

これを利用して、テキストファイルの中の特定番目の文字だけを赤くハイライトするだけのPerlプログラムを作ってみた。

作った理由は単にJSONの構文エラーの時にChromeがエラー個所の文字の位置をDeveloper Consoleでログとして出力してくるので、その特定を早くするため。

僕がいいツールを知らないだけで、最近のJSON整形ツールだとこの程度は内臓されているような気がする。

 

プログラム: position-checker.pl

#!/usr/bin/perl
use strict;
use warnings;
use utf8;

main();

sub main {
  my $file = $ARGV[0] or die("The file is not given.");
  my $position = $ARGV[1] or die("The position is not given.");
  my $text = "";

  # ファイルの読み込み
  open(IN, $file);
  while() {
    $text .= $_;
  }
  close(IN);
  
  my $target_char = substr($text, $position, 1);
  substr($text, $position, 1, "\e[31m".$target_char."\e[m") if ($target_char);
  print($text."¥n");
}

使い方は、第一引数にテキストファイル、第二引数に文字のポジションを指定する。

ただしシバンは適当だしテキストファイルの文字エンコードは特に指定していないし、ファイルロックも考慮していないのであくまで個人用。

実行すると、ポジションで指定した番目の文字が赤くハイライトの状態で出力される。

 

サンプルのファイル: sample.json

{"hoge": "fuga", "foo": "bar", "piyo": "piyopiyo"}

 

実行例:

$ perl position-checker.pl sample.json 18
{"hoge": "fuga", "foo": "bar", "piyo": "piyopiyo"}

 

最近あまりPerlに触れていないので、たまにはこういう息抜きも大事。

 

【JavaScript】Google Chartでグラフの描写後に処理を行う

JavaScriptにて、Google Chartの描写処理が終わった後で何か処理を行いたい場合(コールバック)はaddListenerという関数を使用する。

google.visualization.events.addListener(chart, 'ready', function () {});

 

使用例:

google.charts.load('current', {packages: ['corechart']});
google.charts.setOnLoadCallback(function () {
  var chart = new google.visualization.ColumnChart(document.getElementById('target'));
  google.visualization.events.addListener(chart, "ready", function () {
     
     /** グラフ描写後の処理 **/

  });

  var data = new google.visualization.DataTable();
  data.addColumn("string", "商品名");
  data.addColumn("number", "注文数");
  data.addRows([
    ["アメリカンコーヒー", 80],
    ["エスプレッソ", 120],
    ["カプチーノ", 70],
    ["カフェラテ", 60]
  ]);

  var options = {}
  options["title"] = "販売数";

  chart.draw(data, options);
});

グラフの描写によってレイアウトが崩れるようなHTMlで活用できる。

 

【Bootstrap】「Popovers」でウインドウをリサイズすると表示が崩れる

jQueryでwindowのresizeにフックして調整を行う。

しかし大抵の場合はPopoverを非表示に切り替えていいと思うので、僕は以下のようにしている。

$('[data-toggle="popover"]').popover();
$(window).on('resize', function(){
  $('[data-toggle="popover"]').popover('hide');
});

これで全てのPopoverが閉じるのでレイアウト崩れを気にする必要がない。

 

【Swift4】UILabelにおいて、色を付けたAttributedTextの設定後にUILabel.textColorをするとUILabel.textColorが優先される

ハマったのでメモ。

let text: String = "hogehoge"
let attributedText: NSMutableAttributedString = NSMutableAttributedString(string: text)
attributedText.addAttribute(.foregroundColor, value: UIColor.red, range: NSMakeRange(0, text.count))
let label: UILabel = UILabel(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 100.0, height: 100.0)))
label.attributedText = attributedText
label.textColor = UIColor.black

 こうすると、attributedTextの設定(文字色が赤)が無視されて全部textColorの設定(文字色が黒)になる

let text: String = "hogehoge"
let attributedText: NSMutableAttributedString = NSMutableAttributedString(string: text)
attributedText.addAttribute(.foregroundColor, value: UIColor.red, range: NSMakeRange(0, text.count))
let label: UILabel = UILabel(frame: CGRect(origin: CGPoint.zero, size: CGSize(width: 100.0, height: 100.0)))
label.textColor = UIColor.black
label.attributedText = attributedText

textColorを設定してからattributedTextを設定してやれば、ちゃんと動く(文字が赤になる)