Androidプログラミング質問スレ revision55
■ このスレッドは過去ログ倉庫に格納されています
俺のAndroidアプリ、ストアからインストールした直後数回は普通に立ち上がるんだけど、
何回かすると起動しなくなる
考えられる原因ってなんだと思います? AndroidStudioからインストールした場合は?
エラーログは?
いったんそうなるとデータ削除しても立ち上がらない? >>8
気づいたのは、バックボタンと用意した終了ボタンで終了すると次立ち上がらないっぽい
タスクキルすると次も起動できる
ってことはちゃんと終了処理ができてないのかな Android8.0に更新してから「クラッシュレポートが〜」て表示されてウザいんだがこれどうすればいいん? 具体的な原因箇所を指摘できないけど、
Android 8.0になってから、手動操作でアプリを落とせなくなった感触がある。
アクティビティのみであれば、いままで通りに動くが、
フォアグラウンドサービスなり、なんらかのサービスクラスを派生したスレッドが存在すると
ゾンビ化みたいな挙動を示すときがある。
スタジオを使っている場合は、デバッガが確実にkill -9しに行くようだけど、端末操作だと違った動きをする。
単純な推測、憶測のみで語れば、アクティビティだけを停止して、プロセスそのものは停止しないような制御をするようになった気がする。
過去のレガシーを引きずって、これに陥るとしたらが「アクティビティの破棄」が必ず発生する前提の作りをしているんじゃないかって思う。
何となくアクティビティの破棄(OnDestroy)が来ないタイミングが増えたような気がしている。 そう考える根拠は3つ
1) 実際に俺も同様な体験した事がある
2) 最近のドキュメントを読むと、やたらとアプリケーションコンテキストに誘導するような記述がある
→ プロセスとアクティビティは異なるという設計思想。 ウィンドウに喰われるリソースとプロセスが保持するリソース量は異なる
3) Unixを基礎にしているから、電力の最適化の観点で上記の設計は、メリットが多い
まあ、あくまで俺の見解。 個人的研究に基づく妄想。 以下のように記述した時に,どうしてgetCursor()を使えるのかわかりません.
getAdapter()の返り値がListAdapterでこれをSimpleCursorAdapterにキャストしているのですが,ListAdapterにないgetCursor()をどうして使えるようになるのでしょうか?
getCursor()自体はSimpleCursorAdapteの親クラスであるCursorAdapterにあってCursorAdapterの親クラスのBaseAdapterはListAdapterを実装しているところまでは分かったのですが,getCursor()を使えるようになる理由がわかりません...
public void onItemClick(AdapterView<?> parent, View view, int position, long id){
@Override
Cursor c = ((SimpleCursorAdapter)parent.getAdapter()).getCursor();
c.moveToPosition(position); コピペする時にミスりました
以下のようなコードです
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id){
Cursor c = ((SimpleCursorAdapter)parent.getAdapter()).getCursor();
c.moveToPosition(position); SimpleCursorAdapter is CursorAdapter
getCursorを使う目的だったらCursorAdapterへのダウンキャストで十分 オブジェクト指向の理解が足りてないね
ポリモーフィズムとかのキーワードでぐぐれ Overrideできるからどっかに書いてあるんだYO 見る所間違っていて、この場合のgetAdapterの戻り値はListAdapterではなくTだったので普通に理解できました。お騒がせしました。 >>18
オブジェクト指向の言語は初めてなので理解はまだまだ足りていないと思います
レスの口振り的に戻り値がListAdapterの時も動作すると理解されたのだと思いますが、
後学のためにも解説をお願いします。
もし戻り値がListAdapterの場合はそもそもSimpleCursorAdapteにキャストした時点でエラーが出ると思うのですが違うのでしょうか? ListAdapterはinterfaceだから戻り値がListAdapterのオブジェクトであることはありえない ダウンキャストは危険な操作だ。静的コンパイル時に発見できず、ランタイムエラーを誘発する。通常はダウンキャスト前にinstanceof(Javaの場合)で型チェックしておく。まぁ、どちらにせよ結局はランタイムエラーをスローすることになるとは思うけど。
嫌なら自前でCursorListView作ってCursorAdapterを返すgetAdapterを実装しろ。このクラスで常にキャストを実行するようにすれば少しは安全になるかもしれない。 Androidってjvm介さないネイティブアプリって作れないんかね >>24
Androidはjvmなんて一度も使っていないし、DalvikランタイムやARTランタイムを
使わないC言語だけでのアプリならAndroid 2.3から可能になっている >>24
VisualStudioで作れるよ。
出力されたスケルトン見て、ソッ閉じした。
ネイティブアプリケーションにしても、 ア クティビティのジレンマは回避できない。 retrofit2で以下のような階層のリクエストパラメータをpostしたいです。
User
id
name
image(画像)
age
child
id
name
image(画像)
age
画像を送るため@multipartをinterfaceに付加していますが、この場合パラメータをはどのように作成していけばよいでしょうか?
引数に@PartMap Map<String, Object> hogeとして試しましたが、リクエストが送れませんでした。
(コールバックにてonFailure)
ご助言を頂けますと幸いとなります。
宜しくお願いします。 よろしくお願いします。
1 public class MainActivity extends AppCompatActivity{
2 ・・・
3 Gview gView=new Gview();
4
5 public class Gview extends View{
6 public GameView(Context context){
7 super(context);
8 TextView textView =(TextView) findViewById(resID);
9 textView.setText("***"); }}}
とすると、コード上はエラーにならず、アプリケーションの起動エラーとなります。
9行目の textView.setText("***");を削除すると起動します。
エラーはNullpointerExceptionで、textViewがNullになってしまっています。
8,9行目のコードをMainActivity下の3行目あたりに移して実行すると、エラーは生じません
なぜ、Gviewクラスのコンストラクタ内ではNullエラーになるのでしょうか?
他のスレで教えていただいたのは、ViewクラスのfindViewByIdを呼んでいるとのこと。
GviewでsetTextする方法を教えてください。 >>30
どうしてもやりたいなら
8 TextView textView =(TextView) ((AppCompatActivity)context).findViewById(resID);
のような感じでいけると思うけど、おすすめしない MainActivityのfindViewByIdを明示的に呼ぶ LayoutInflater.from(context) みなさま、ありがとうございました。
お教えに従って進めてみます! そもそもpublicクラスを2つ書くのが無理じゃない?
内部クラスかな >>28
c#勢なんかがアプリ開発に手を出しやすくなると思う kotlin書きやすいしGoogleもやる気みたいだからこれからはkotlinで書いたほうがいいんじゃ?
公式のサンプルコードも最近はkotlin多いし Googleはやる気あるか?
Fuchsiaは対応言語にJavaもKotolinも無いし >>40
それはKotlin作ってるのがGoogleではないからでは?
Javaと同様にJetBrainsが後から対応させれば良かろう。 kotlinとscalaだとscalaのが圧倒的に検索ページ数多いな fuchsiaでosのアップデート権限をキャリアからとりもどすのが最大の目的(適当) いつも画面のレイアウト作るのが面倒なんだけど、
なんか良いツールとかありませんか? みなさん、XMLへのメモリの割り当てってどの程度してますか? >>30
Gviewのコンストラクタはそういうことをしてよい場所ではありません
TextViewとGviewはともにViewというお母さんを持つ姉妹です
あなたはその妹のおなかのなかで姉を誕生させようとしている変人です
あなたが理解すべきことは
コンストラクタの役割
publicクラスの作り方
View継承クラスは何をしたいときに作るものなのか
の3つです >>52
viewの入れ子なんて極々普通なことだよ。 ViewとViewクラスは違うのでViewクラスにViewとしての理念を適用してはならない、というなんかこうめんどくさいやつだな >>30
メンバー生成と同時に実体化するとonCreateの前に走ってエラーになったよ
中の人の準備の都合だろうね
onCreateのなかでgView=new Gview(); するとよい 独自viewクラスって最早アンチパターンじゃないか? >>53
「gViewのコンストラクタ」で他のview を生成しid参照することがおかしいということを質問者にざっくり理解してもらいたいだけ
質問者のgViewがViewGroupの継承クラスだとはとても思えないし 皆様ありがとうございます。
基本的な理解が足りてないようでとても勉強になります。
スッキリ読んだだけだと、そういうセンス的なところが身につかないのかな?
とにかく、とても参考にさせていただきました。 教えてください。
WebViewでsaveWebArchiveしたファイルを、loadurlで読み込むのですが、webページとして表示されず、テキスト表示なります。
うまく読み込む方法はないでしょうか?
##保存
webview.saveWebArchive("適当なURL")
##読み込み
webview.loadUrl("上記URL")
と
webview.loadDataWithBaseURL("上記URL", null, "application/x-webarchive-xml", "UTF-8", "上記URL")
## 確認したところ
teratail、スタックオーバーフロー、そのほか個人ブログなど
##開発環境
android 8.0(P10 lite) >>45
ページ数をどうやって数えた気分になっているのか。
Googleに表示された検索ヒットページ数は、完全な虚偽表示だぞ。
そのまま1000ページ目まで捲ればわかる。
大抵は14ページから20ページで終るから >>62
それ同じやつ表示しないようにしてるからでは?
最後まで行くと同じやつも出すリンク出てくるよ。 >>63
うん。表示されたページ数を信じる点がスレ住人にしては、素朴だなーって趣旨。 「確かめようがない情報は、嘘を書いても損失がない。従って何をいっても表示しても規制、誘導してもよい」
それがGoogleダークパタンの根っこにある彼等の共通理解。 だがページ数の欺瞞でわかるように、確かめる術をみえない所に散りばめてアリバイを作る。
ほら確認すれば、わかりますよニヤニヤ(無能w)
これがGoogleの本質。 scalaの方が古いんだからページ数多いの当然では? ググルの情報の真偽はともかく、一応ググルと違うデータベースを
使ってるbingで検索すると結構違う結果になるし、リンク切れを
起こしてるページもbingだと接続できないけどググルだとAdSenseの
ページが表示されたり怪しいことは怪しいっていうか、色々ググルで
情報が加工されてるような感じはあるね MainActivityで、findViewById(R.id.radioButton);
で取得したButtonビューの、◎ボタンの色を変えたいのですがコードを教えてください
あと、同じく丸いadioButtonを□にしたりできませんか? 1 RadioButton radioButton=findViewById(R.id.radioButton);
2 radioButton.setBackgroundColor(Colorrgb.(255,255,255));
で、バックグラウンドの色はセットできますが、
同じような書式というか丸ボタンの色を変えられるメソッド、
例えば、setButtonColor(…); のようのってないのでしょうか? Admob広告外し対策にはどのような方法がありますか?
何か有効な情報ページないですかね >>73
そもそも、そのアプリはそんなにダウンロードされてるの?
対策するのは、その後でも良いような? コンソールで使うJavaのプログラムを移植したいのですが
アプリ内で標準入出力を扱うにはどうすればいいですか? >>73
逆に広告を表示することで機能を追加するアプリならみたことある
広告が表示されてるかきちんと判定できればこういうやり方もありだなあと onAdLoaded() が呼ばれたからといって広告がきちんと表示されてるとはがぎらないってことなのだろうか?
改変したのはこれが呼ばれた上で広告が表示されないとか? スピナーを付ける時、デフォルトだと右側に▼が付くけど、
android:backgroundでレイアウト.xmlを指定すると消えてしまいます。
▼を表示させるか、レイアウトに▼(に近い形)を追加する方法は無いでしょうか? >>77
後付けで如何様にも変更される。
2017年のインタースティシャル広告をペナルティとか。 >>78
スピナーに入れる項目を"項目名"+" ▼"ってすれば出るよ >>80
それ全部の項目に▼が付くじゃないですか・・・ >>79
onAdLoaded()がだめということは結局広告がきちんと表示されてるかどうかを判別する方法はないってことなんですかね?
何か他の方法はないものだろうか… Timerの中でrunOnUiThreadを実行する時、
runOnUiThreadの中身が重いと、複数回実行してしまうことってありますか?
Timerを1秒毎にscheduleAtFixedRateで実行して、
runOnUiThreadの実行回数を見ていたら、
同じ秒数にrunOnUiThreadが2回発生している現象が見られました。
とりあえずrunOnUiThreadの中身を整理したところ直ったのですが、
原因が不明でスッキリしなくて。
漠然とした質問ですいませんが、よろしくお願いします。 >>84
----+----1----+----2----+----3
----------やれ------やれ------やれ
----------はい---------おわた
やれは定期
ハイカラおわたは処理時間
やれはキューされる。
よっておそけりゃ直ぐくるというなら、そういうことかと。 そもそも、runOnUiThreadで重い処理やっちゃダメだろ。 GDPRとConsent SDKについて質問です。
ttps://qiita.com/tokisuzume/items/de41f901ce772c7880c4
この解説ページ見てるのですが、選択フォーム表示でNOを選択すると
非パーソナライズ広告の表示に’同意のボタン’が出てきますよね。
EUの人がこちらを選んでAdMobの非パーソナライズ広告を表示すれば制裁の対象にならないのでしょうか? …@
いっそのことヨーロッパの人には全部非パーソナライズ広告にしてしまえばと思うのですが
こうするとなにかデメリットでもあるのでしょうか? …A
またプログラムには default: // 同意が得られなかったのでアプリを終了
がありますが、選択ボタンには非パーソナライズOKの選択ボタンはありますが他に
同意しない(拒否)の選択ボタンはありませんよね?
拒否で終了へ向かうにはどういう操作をすればいいことになっているのでしょうか?(それとも実際はないのか?) …B
@ABの3つについてお願いします。 >>88
ひとつだけ
.withAdFreeOption()を有効にすれば『同意しない』ボタンがでるよ
自分はこれで有料版へのリンクもしくは終了させてる >>90
出ました。ありがとうございます。
そのサイトのプログラムでは初回の選択後、2回目からは
onConsentFormClosed()で必ず case NON_PERSONALIZED: が呼ばれてしまいますが
1回目の選択を保存しておいてここでロードしてその内容で自分で設定しないといけない感じなんですかね 訂正 onConsentFormClosed()で→onConsentInfoUpdated()で
ボタン文変えるには
/app\build\intermediates\assets\フォルダ内のconsentform.htmlを変えればよい。
とあるけどこれも日本語の解説サイトほとんどないなあ。 サーバがUNKNOWNを返したらダイアログを表示するというロジックなので、サーバの応答次第では毎回ダイアログが表示されるということもありうる
これを避けるにはアプリ側でもフラグをもってダイアログ表示の制御をしたほうが良いと思う、サーバ側のバグはこちらではどうしようもないから 同意しないで終了するボタンつけた方がいいかな
さすがに欧州の人も同意フォームに見慣れてきて
バックボタンが効かなくてムキー☆1ってなることはないと思うんだが デフォルトの Pay for 〜 という名前のボタンじゃ押しにくいよね
これを Exit とかに変更する方法が書いてあるサイトないもんかなあ。 >>86-87
そうですよねー、ありがとうございますっ! レビューダイアログのライブラリってありますでしょうか
単にplay storeに飛ばすだけじゃなくて、
星を選択して結果を送れるようなものがいいです Android上で動くAIアプリ作りたいんだけど入門用におすすめのHPとか参考書あります?
目標としては音声認識して回答を返せるようなの作りたいです ■ このスレッドは過去ログ倉庫に格納されています