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

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

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

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

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

Android

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

Android Studio

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

Q&A

解決済

2回答

5118閲覧

Fragmentのボタン処理がうまくいかない

Haru_T

総合スコア34

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Java

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

Android

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

Android Studio

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

0グッド

0クリップ

投稿2016/10/12 06:13

英単語帳アプリを作っています。
Fragmentを用意しViewPagerを使ってスライドしていきます。
SQLiteファイルからデータを取得し、
単語や意味などの一覧を画面に表示させることはできるようになりました。
あくまでも単語帳なので、初めに単語を出してから
ボタンをタップして意味などを出すようにしたいと考えています。

一度自分なりに調べた方法で試してみると、
1つ目の単語はうまいこと表示できますが、
2つ目の単語以降、ボタンをタップしたところ
前のページ(1つ前の単語のページ)に意味が出てしまいます。
※3つ目の単語のページでボタンをタップしたら3ページには何も出ず、2ページに3つ目の単語の意味が出る、という意味です。

どこに問題があるのでしょうか、、、

JAVA

1package com.example.wordcard2; 2 3import android.support.v4.app.Fragment; 4import android.graphics.Color; 5import android.os.Bundle; 6import android.util.Log; 7import android.view.LayoutInflater; 8import android.view.View; 9import android.view.ViewGroup; 10import android.widget.Button; 11import android.widget.TextView; 12 13import org.w3c.dom.Text; 14 15public class wordFragment extends Fragment { 16 17 @Override 18 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 19 // View をつくる 20 View layout = inflater.inflate(R.layout.fragment_word, container, false); 21 22 Bundle bundle = getArguments(); 23 int page = bundle.getInt("page"); 24 String word = bundle.getString("word");/*※①*/ 25 26 TextView wordView = (TextView) layout.findViewById(R.id.word_view); 27 wordView.setText(word); 28 29 TextView pageView =(TextView) layout.findViewById(R.id.page_view); 30 pageView.setText(String.valueOf(page)); 31 32 Button button = (Button) layout.findViewById(R.id.mean_button); 33 button.setOnClickListener(new View.OnClickListener() { 34 35 @Override 36 public void onClick(View v) { 37 38 Bundle bundle = getArguments(); 39 int page = bundle.getInt("page"); 40 String word = bundle.getString("word"); /*※①と同じ単語を取得*/ 41 String pron1 = bundle.getString("pron1");/*単語の発音記号を取得*/ 42 String pron2 = bundle.getString("pron2");/*発音記号カナ読みを取得*/ 43 String mean1 = bundle.getString("mean1");/*意味①を取得*/ 44 String mean2 = bundle.getString("mean2");/*意味②を取得*/ 45 String des = bundle.getString("des"); /*注意点や詳細を取得*/ 46 String part = bundle.getString("part"); /*品詞を取得*/ 47 48 TextView pronView =(TextView) getActivity().findViewById(R.id.pron_view); 49 pronView.setText(word +"【" + pron1 + pron2 + "】"); 50 51 TextView partView =(TextView) getActivity().findViewById(R.id.part_view); 52 partView.setText(part); 53 54 TextView mean1View =(TextView) getActivity().findViewById(R.id.mean1_view); 55 mean1View.setText("①" + mean1); 56 57 TextView mean2View =(TextView) getActivity().findViewById(R.id.mean2_view); 58 mean2View.setText("②" + mean2); 59 60 TextView desView =(TextView) getActivity().findViewById(R.id.des_view); 61 desView.setText(des); 62 } 63 }); 64 65 return layout; 66 } 67} 68

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

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

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

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

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

guest

回答2

0

ソースコードを拝見しましたが、同じFragment内のレイアウトに単語の意味を表示させたいという認識で合っているでしょうか。

それならばbutton.setOnClickListener内でgetActivity().findViewByIdを行っていることが原因ではないかと思います
Activity下に同じidのViewが複数存在するとfindViewByIdで正しくViewが取得できないです。

java

1final View layout = inflater.inflate(R.layout.fragment_word, container, false); 2 3// その他処理 4 5Button button = (Button) layout.findViewById(R.id.mean_button); 6button.setOnClickListener(new View.OnClickListener() { 7 @Override 8 public void onClick(View v) { 9 10 //その他処理 11 12 TextView pronView =(TextView) layout.findViewById(R.id.pron_view); 13 pronView.setText(word +"【" + pron1 + pron2 + "】"); 14 15 //その他処理 16 17 } 18});

このように該当のFragmentのレイアウトからfindViewByIdを行えば期待通りの動作になると思います。

補足ですが、このようにonClick内でfindViewByIdを使ってしまうとクリックするたびにfindViewByIdを行ってしまうので、あくまで個人的な意見ですがonCreateViewなどでfindViewByIdを行いインスタンス変数などで保持しておくといいと思います。

投稿2016/10/12 06:53

meilcli

総合スコア132

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

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

Haru_T

2016/10/12 07:02

いえ、クリックするたびで大丈夫です! 単語初めに表示させ、意味を出し、次の単語に行き、、、とうような単語カードのようなものを考えているので(^^) getViewにしたらできました!本当にありがとうございます!!
guest

0

ベストアンサー

Activity上のViewに意味などを表示するんですか?
違うならgetActivity().findViewByIdとしているのが怪しいです。
getView().findViewByIdを試してください。

投稿2016/10/12 06:47

yona

総合スコア18155

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

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

Haru_T

2016/10/12 07:05

getViewにしたところ自分がしたいようにできました!! いつも本当に助かっています。ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問