質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

2回答

2250閲覧

fragment上からDatePickerDialog表示時、日付部分の非表示設定にて落ちる。

zackieeee

総合スコア16

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2019/05/20 03:18

編集2019/05/20 04:40

プログラミングを始めて2か月程度の初心者です。
いろいろと足りない部分、的外れな部分あるかもしれませんが、よろしくお願いいたします。

前提・実現したいこと

fragmentから呼び出されるDatePickerDialogについて”日付”を隠した状態で表示させたい。
(上記ダイアログから取得した年、月のみ後続で使用するため)

発生している問題・エラーメッセージ

下記ページを参考に実装しましたが、肝心のDatePickerDialogの日付を隠す処理でエラー<エラー内容抜粋参照>が発生しています。

参考ページ:http://hakobera.hatenablog.com/entry/2013/12/16/235423

<エラー内容抜粋>
※日付部品自体が見つからないというエラーとの認識ですが、解決方法が見つかりません。

2019-05-20 11:41:37.909 24208-24208/jp.co.apps.workout.myapplication E/AndroidRuntime: FATAL EXCEPTION: main Process: jp.co.apps.workout.myapplication, PID: 24208 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.setVisibility(int)' on a null object reference at jp.co.apps.workout.myapplication.GraphFragment$3.onClick(GraphFragment.java:174)

該当のソースコード

Java

1 2graphDate.setOnClickListener(new View.OnClickListener() { 3 @Override 4 public void onClick(View v) { 5 6DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), android.R.style.Theme_Holo_Light,new DatePickerDialog.OnDateSetListener() { 7 8 @Override 9 public void onDateSet(DatePicker view, int yyyy, int mm, int day) { 10 11 LineData data = getData(selectKey,yyyy,mm); 12 setupChart(charts[0], data, colors[0 % colors.length]); 13 14 graphDate = (TextView)getView().findViewById(R.id.graphDate); 15 graphDate.setText(String.valueOf(yyyy)+"年"+String.valueOf(mm+1)+"月"); 16 17 //日付設定 18 cal.set(yyyy,mm,1,0,0,0); 19 20 year = cal.get(Calendar.YEAR); 21 month = cal.get(Calendar.MONTH); 22 23 } 24 }, cal.get(Calendar.YEAR),cal.get(Calendar.MONTH),cal.get(Calendar.DATE)); 25 26//DatePickerDialogの日付パーツのリソースIDを取得 27 int dayId = datePickerDialog.getDatePicker().getResources().getIdentifier("day", "id", "android"); 28//DatePickerDialogの日付パーツに対して、スペースを詰めてパーツ非表示を設定。 29 **datePickerDialog.findViewById(dayId).setVisibility(View.GONE); ←ここでエラー発生** 30 31 datePickerDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.argb(250,220,220,220))); 32 datePickerDialog.show(); //DatePickerDialogを表示する 33 34 } 35 });

※DatePickerDialogのパーツ非表示のため、findViewById(dayId)のレイアウト割愛。
(分からないため…)

試したこと

エラー発生個所をコメントアウトすれば、エラーは解消することを確認。
dayId及び、View.GONEのみを切りだし、戻り値がnullとならないことを確認。

datePickerDialog.findViewById(dayId).setVisibility(View.GONE)のdatePickerDialog部分をいくつか変更(頭にView.を付けるなど)して試してみましたが、ダメでした。

解決方法、アドバイスなどを頂けると幸甚です。
よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/05/20 03:32

コード、エラーはマークダウンcode機能にてご提示ください(質問は編集できます)
dsuzuki

2019/05/20 04:10

.findViewById(dayId) の結果がnullになっていませんか? nullオブジェクトに対してsetVisibility(int)を実行しているというエラーなので。
zackieeee

2019/05/20 04:42

>mts10806さん ありがとうございます。 表記を修正いたしました。 >dsuzukiさん ありがとうございます。 ご指摘のとおり、.findViewById(DayId)がnullのため、それに対して設定が出来ない。 ということだと思っています。 ですが、どうすれば参照できるのか分からなくて困っています。。
zackieeee

2019/05/20 05:14

ネットで探した結果Android 7.0以降では利用ができないことが分かりました。 もし可能なら、他に実現方法などがないかアドバイス頂けるとありがたいです。 すみません、よろしくお願いいたします。
guest

回答2

0

自己解決

dsuzukiさんにご教示いただいた方法で解決いたしました。
参考にコードを記載しておきます。

(補足)
layoutは TextView(id:textView)のみのシンプルなものですので割愛します。
また、”.findViewById(Resources.getSystem().getIdentifier("day"…”のday部分をyear,monthとすることで年や月が消えることも確認済みです。

java(android

1package jp.co.apps.workout.test; 2 3import android.app.DatePickerDialog; 4import android.content.res.Resources; 5import android.graphics.Color; 6import android.graphics.drawable.ColorDrawable; 7import android.support.v7.app.AppCompatActivity; 8import android.os.Bundle; 9import android.view.View; 10import android.widget.DatePicker; 11import android.widget.TextView; 12 13import java.util.Calendar; 14import com.websarva.wings.android.recyclerviewsample.R; 15 16public class MainActivity extends AppCompatActivity implements View.OnClickListener { 17 18 TextView textBtnDatePicker; 19 private int mYear, mMonth, mDay; 20 21 @Override 22 protected void onCreate(Bundle savedInstanceState) { 23 super.onCreate(savedInstanceState); 24 setContentView(R.layout.activity_main); 25 26 textBtnDatePicker = findViewById(R.id.textView); 27 textBtnDatePicker.setOnClickListener(this); 28 } 29 30 @Override 31 public void onClick(View view) { 32 if(view == textBtnDatePicker){ 33 34 Calendar c = Calendar.getInstance(); 35 mYear = c.get(Calendar.YEAR); 36 mMonth = c.get(Calendar.MONTH); 37 mDay = c.get(Calendar.DAY_OF_MONTH); 38 39 DatePickerDialog datePickerDialog = 40 new DatePickerDialog(MainActivity.this, 41 42 android.R.style.Theme_Holo_Light_Dialog, //このテーマはAPI28から不推奨らしいが… 43 new DatePickerDialog.OnDateSetListener() { 44 45 @Override 46 public void onDateSet(DatePicker view, 47 int year, 48 int monthOfYear, 49 int dayOfMonth) { 50 textBtnDatePicker.setText(year + "年" + (monthOfYear + 1) + "月");//月のカウントは0始まりなので+1 51 } 52 }, mYear, mMonth, mDay); 53 54 //spinnerの表記は端末の言語設定に依存。日本語設定していれば"YYYY MM"表記。英語だと"DDD YYYY" 55 (datePickerDialog.getDatePicker()) 56 .findViewById(Resources.getSystem().getIdentifier("day", "id", "android")) 57 .setVisibility(View.GONE); 58 59 datePickerDialog.setTitle("表示年月を選択");//タイトル不要であれば削除 60 datePickerDialog.getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//これがないとDialogの外枠に白背景が出現 61 datePickerDialog.show(); 62 } 63 } 64}

イメージ説明

投稿2019/05/22 03:24

編集2019/05/22 03:34
zackieeee

総合スコア16

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

古い記事なのでどの程度参考になるかわかりませんが、int dayId の取得方法が異なっています。
datePickerDialog.getDatePicker(). がいらないんじゃないかな。

※下記記事の引用は一部修正しています。
DatePickerの年月日の非表示がめんどくさい 2013年8月9日

int dayId = Resources.getSystem().getIdentifier(“day”, “id”, “android”);

Android4.0でDatePickerDialogのDividerの色を変更する方法 2016年12月02日

int dayId = getResources().getIdentifier("day", "id", "android");

----追加:未検証
Hide Date from Date Picker
リフレクションを利用して、日のPickerに.setVisibility(View.GONE)を実施しています。
(DatePickerのソースコードから、DatePicker.mDelegate を DatePickerSpinnerDelegateとして、mDaySpinnerがとれると思われる。※全てprivateです。)
あと、コメント欄の下記も参考になるかも。
pickerSpinnersHolder.findViewById(R.id.day).setVisibility(View.GONE);

投稿2019/05/20 05:07

編集2019/05/21 11:33
dsuzuki

総合スコア1682

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

zackieeee

2019/05/20 05:59

ありがとうございます! 試してみたのですが、やはり同様のエラーが出てしまうようです。 上記2つの結果得られるリソースIDは共に16908819のため、返している値には問題ないように思います。それでもfindViewByIdの結果がnull object referenceになるということは、、findViewByIdの参照の仕方(viewを指定するとか…)が悪いか、該当の部品の参照が許されていないか…かなと思います。。
dsuzuki

2019/05/21 11:34

ググった結果と、Androidのソースコードから、情報を追記してみました。
zackieeee

2019/05/22 00:58

色々とありがとうございます! 現在試していますが、いけそうな感じです。ひとまず、ご一報いたします。 結果、改めてご報告いたします。 よろしくお願いします。
zackieeee

2019/05/22 03:19

頂いたリンクを参考にテストコーディングしてみた結果、うまくいきました! 参考として、上手くいったテストコードを別解決方法に載せておきます。 ありがとうございました!! (また、色々と質問させて頂こうと考えています。  ご縁がありましたら、また、どうぞよろしくお願いいたします。
dsuzuki

2019/05/22 03:22

こちらこそ、検証していただきありがとうございます。
zackieeee

2019/05/22 03:29

回答頂いた内容をベストアンサーにするつもりでしたが…テストコード投稿をベストアンサーとしてしまいました。。。すみません。。。
dsuzuki

2019/05/22 03:34

最終形がわかった方が役に立つので、お気になさらずに。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問