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

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

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

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

1回答

4042閲覧

ListViewのアイテムに対してフォントを設定する

退会済みユーザー

退会済みユーザー

総合スコア0

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

Java

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2017/09/17 10:16

編集2017/09/17 13:56

ListViewのアイテムに対してフォントを設定したいです。

TextView quiz = (TextView)findViewById(R.id.quiz); quiz.setTypeface(Typeface.createFromAsset(getAssets(), "font.ttf"));

という方法でfontを設定しているのですが、どのタイミングで呼び出せばよいのでしょうか?

またこの方法で呼び出すと体感として少し重いような気がするのですが、より良い方法もあれば合わせて教えていただきたいです。
よろしくお願いします。

ちなみにコードは下記のとおりです。

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_list); setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); ListView listView = (ListView) findViewById(R.id.lv); ArrayList<ListItem> listItems = new ArrayList<>(); ListAdapter adapter = new ListAdapter(this, 0, listItems){ @Override public View getView(int pos, View convertView, ViewGroup parent) { TextView textView = (TextView)findViewById(R.id.d1); textView.setTypeface(Typeface.createFromAsset(getAssets(),"font.ttf")); return super.getView(pos, convertView, parent); } }; QuizOpenHelper quizOpenHelper = new QuizOpenHelper(this); SQLiteDatabase sqLiteDatabase = quizOpenHelper.getReadableDatabase(); String sql = "select quiz from quiz where _id between 1 and 50"; Cursor cursor = sqLiteDatabase.rawQuery(sql, null); cursor.moveToFirst(); int i = 0; boolean next = cursor.moveToFirst(); while (next){ quizs[i] = cursor.getString(cursor.getColumnIndex("quiz")); i ++; next = cursor.moveToNext(); } cursor.close(); sqLiteDatabase.close(); for (int c = 0; c < 50; c++) { ListItem listItem = new ListItem(); listItem.setText(quizs[c]); listView.setAdapter(adapter); listItems.add(listItem); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { quizNo = position + 1; Intent intent = new Intent(List.this,Game.class); intent.putExtra(EXTRA_QUIZNO,quizNo); startActivity(intent); } }); } } コード

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

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

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

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

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

yona

2017/09/17 13:21

フォントを設定している箇所を質問に載せてください。
退会済みユーザー

退会済みユーザー

2017/09/17 13:30

ListViewにはどこでfontを設定してよいかわからずにまだ設定していません。なのでどのタイミングでsetTypefaceをすればよいのかというのがメインの質問になります。それが分かったうえで、より高速化の余地がありほかのやり方もあるのであれば教えていただきたいです。
guest

回答1

0

ベストアンサー

ListAdapterを継承してListAdapter#getViewをオーバーライドしてください。
ここで、全てのViewを設定してください。

投稿2017/09/17 13:35

yona

総合スコア18155

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

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

退会済みユーザー

退会済みユーザー

2017/09/17 13:58

質問文のように修正してみたのですがtextView.setTypeface(Typeface.createFromAsset(getAssets(),"font.ttf")); の行でNullPointerExceptionが発生してしまいます。 どこかおかしなところはありますか?
yona

2017/09/17 14:18

エラーが発生したらまず自分でデバッグしてください。
退会済みユーザー

退会済みユーザー

2017/09/17 14:29

textViewがnullになってしまっているのが原因ですよね。 ListViewが呼び出されていないのにTextView textView = (TextView)findViewById(R.id.d1);をしたためということでしょうか? この場合 ListAdapter adapter = new ListAdapter(this, 0, listItems){ @Override public View getView(int pos, View convertView, ViewGroup parent) { TextView textView = (TextView)findViewById(R.id.d1); textView.setTypeface(Typeface.createFromAsset(getAssets(),"font.ttf")); return super.getView(pos, convertView, parent); } }; のタイミングを変える必要があるということであってますでしょうか? どこに変えるとよいのでしょうか 質問ばかりですみません。よろしくお願いします。
yona

2017/09/17 14:52

ListAdapterの使い方を間違っています、使い方を調べてから再度実装してください。
退会済みユーザー

退会済みユーザー

2017/09/17 15:44

ListAdapter adapter = new ListAdapter(this, 0, listItems){ @Override public View getView(int pos, View convertView, ViewGroup parent) { TextView textView = (TextView)super.getView(pos, convertView, parent); textView.setTypeface(Typeface.createFromAsset(getAssets(), "Nyashi.ttf")); return textView; } }; 調べてみてこのように書いてみたのですがjava.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextViewとなってしまいました。 それについても調べてみて ListAdapter adapter = new ListAdapter(this, 0, listItems){ @Override public View getView(int pos, View convertView, ViewGroup parent) { LinearLayout linearLayout = (LinearLayout)super.getView(pos, convertView, parent); TextView textView = (TextView)linearLayout.findViewById(R.id.d1); textView.setTypeface(Typeface.createFromAsset(getAssets(), "Nyashi.ttf")); return textView; } }; このように変えてみたのですが、ここでもjava.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.AbsListView$LayoutParamsが発生してしまいましたどのようにTextViewを宣言すればよいのでしょうか?よろしくお願いします。
退会済みユーザー

退会済みユーザー

2017/09/17 15:54

ListAdapter adapter = new ListAdapter(this, 0, listItems){ @Override public View getView(int pos, View convertView, ViewGroup parent) { LinearLayout linearLayout = (LinearLayout)super.getView(pos, convertView, parent); TextView textView = (TextView)linearLayout.findViewById(R.id.d1); textView.setTypeface(Typeface.createFromAsset(getAssets(), "Nyashi.ttf")); return linearLayout; } }; とすることで実装はできましたが、ものすごく重くスクロールもスムーズにしない状態になってしまいました。 何がいけないのでしょうか?
yona

2017/09/17 16:02

調べて見つけたサイトにそのような書き方が記載されていたんですか? だとしたら、サイトが誤っているか、サイトの意図を取り違えていると思いますよ。
退会済みユーザー

退会済みユーザー

2017/09/17 16:06

このようなコードが記載されていました。 自分の力不足で調べてもどれが正しいやり方なのかわからない状況です。 これは全く違うコードということでしょうか? どのようにするのが正解なのか教えていただけないでしょうか?
退会済みユーザー

退会済みユーザー

2017/09/18 09:18

http://fxscore.blog59.fc2.com/blog-entry-98.html ここなど見てみたのですが、やはりどんなに検索しても ListAdapter adapter = new ListAdapter(this, 0, listItems){ @Override public View getView(int pos, View convertView, ViewGroup parent) { TextView textView = (TextView)super.getView(pos, convertView, parent); textView.setTypeface(Typeface.createFromAsset(getAssets(), "Nyashi.ttf")); return textView; } }; この書き方にたどり着いてしまいます。 その結果java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextViewとなってしまい、 ListAdapter adapter = new ListAdapter(this, 0, listItems){ @Override public View getView(int pos, View convertView, ViewGroup parent) { LinearLayout linearLayout = (LinearLayout)super.getView(pos, convertView, parent); TextView textView = (TextView)linearLayout.findViewById(R.id.d1); textView.setTypeface(Typeface.createFromAsset(getAssets(), "Nyashi.ttf")); return linearLayout; } }; このように変更せざるを得ません。 このコードのおかしなところを教えていただけませんか?
yona

2017/09/18 11:34

遅い原因はTypeface.createFromAsset(getAssets(), "Nyashi.ttf")を毎回呼び出しているからです。 この処理はassetsからフォントファイルを読み込んでインスタンス化するので、ListViewでスクロールするたびにフォントファイルを読み込む処理が発生していることになります。 上記をTypeface型のインスタンスとして一度だけ読み込んで使いまわしてください。
退会済みユーザー

退会済みユーザー

2017/09/18 12:37

ありがとうございます!うまくいきました! 長く付き合っていただき本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問