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

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

ただいまの
回答率

90.00%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,162

Haru_T

score 32

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

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

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

package com.example.wordcard2;

import android.support.v4.app.Fragment;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

import org.w3c.dom.Text;

public class wordFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        // View をつくる
        View layout = inflater.inflate(R.layout.fragment_word, container, false);

        Bundle bundle = getArguments();
        int page = bundle.getInt("page");
        String word = bundle.getString("word");/*※①*/

        TextView wordView = (TextView) layout.findViewById(R.id.word_view);
        wordView.setText(word);

        TextView pageView =(TextView) layout.findViewById(R.id.page_view);
        pageView.setText(String.valueOf(page));

        Button button = (Button) layout.findViewById(R.id.mean_button);
        button.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Bundle bundle = getArguments();
                int page = bundle.getInt("page");
                String word = bundle.getString("word"); /*※①と同じ単語を取得*/
                String pron1 = bundle.getString("pron1");/*単語の発音記号を取得*/
                String pron2 = bundle.getString("pron2");/*発音記号カナ読みを取得*/
                String mean1 = bundle.getString("mean1");/*意味①を取得*/
                String mean2 = bundle.getString("mean2");/*意味②を取得*/
                String des = bundle.getString("des");  /*注意点や詳細を取得*/
                String part = bundle.getString("part"); /*品詞を取得*/

                TextView pronView =(TextView) getActivity().findViewById(R.id.pron_view);
                pronView.setText(word +"【" + pron1 + pron2 + "】");

                TextView partView =(TextView) getActivity().findViewById(R.id.part_view);
                partView.setText(part);

                TextView mean1View =(TextView) getActivity().findViewById(R.id.mean1_view);
                mean1View.setText("①" + mean1);

                TextView mean2View =(TextView) getActivity().findViewById(R.id.mean2_view);
                mean2View.setText("②" + mean2);

                TextView desView =(TextView) getActivity().findViewById(R.id.des_view);
                desView.setText(des);
            }
    });

        return layout;
  }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/12 16:05

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

    キャンセル

0

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

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

final View layout = inflater.inflate(R.layout.fragment_word, container, false);

// その他処理

Button button = (Button) layout.findViewById(R.id.mean_button);
button.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {

    //その他処理

    TextView pronView =(TextView) layout.findViewById(R.id.pron_view);
    pronView.setText(word +"【" + pron1 + pron2 + "】");

    //その他処理

  }
});

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/10/12 16:02

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

    キャンセル

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

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる