1

本当に簡単ですが、わかりません。Fragmentsインフレートする XML ファイルにある ID でビューを参照したいと考えています。

ビューを宣言しています。

TextView nameView;

レイアウトからビューを取得しています。

View view = inflater.inflate(R.layout.trackfrag, group, false);
nameView = (TextView)view.findViewById(R.id.trackName);

アクティビティから呼び出されると、以下のメソッドで問題が発生します。

 public void setTrackDetails (String name, String description) {
    Log.e("TRACKFRAG", "setTrackDetails Called");
    nameView.setText(name);
    Log.e("TRACKFRAG", "setTrackDetails Finished");
}

どんな助けでも大歓迎です。

追加された XML

            <TextView
            android:id="@+id/trackName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/anchor"
            android:text="Track Name"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textSize="22sp" />

このFragmentメソッドを呼び出さなくても がロードされて正常に表示されますが、いずれかのテキストを変更する方法が必要ですText Views

追加フラグメントの作成

public void onTrackSelected(String track) {
    Log.e("FRAGTRANS","History List Pressed");

    Fragment trackFrag = getFragmentManager().findFragmentByTag("historytrack");
    if (trackFrag == null) {
        trackFrag = new TrackFragment();
        Log.e("TRACKSEL","new trackfrag created");
    }

    addFragment(trackFrag, true, HISTORYTAG, FragmentTransaction.TRANSIT_NONE);

    ((TrackFragment) trackFrag).setTrackDetails(track,"testing");
}

フラグメントメソッドを追加

void addFragment(Fragment fragment, boolean addToBackStack, String tag, int transition) {
        FragmentTransaction ft = getFragmentManager().beginTransaction();
        ft.replace(android.R.id.content, fragment);
        ft.setTransition(transition);
        if (addToBackStack)
            ft.addToBackStack(null);
        ft.commit();
    }
4

3 に答える 3

2

問題は、setTrackDetails()メソッドの呼び出しにあります。あなたがそれを見ることができるここを見てください:

commit()を呼び出しても、トランザクションはすぐには実行されません。むしろ、スレッドが実行できるようになるとすぐに、アクティビティのUIスレッド(「メイン」スレッド)で実行するようにスケジュールします。

したがって、commitを呼び出した直後は、フラグメントがまだ作成されていないか、作成が進行中であり、nameViewがまだ設定されていません。最善の解決策は、フラグメントを作成した後(フラグメントにはすでにアクティビティがあるため、nameViewを設定した後でもかまいません)、テキストを受け取るアクティビティからメソッドを呼び出すことです。

View view = inflater.inflate(R.layout.trackfrag, group, false);
nameView = (TextView)view.findViewById(R.id.trackName);
String str = ((MyActivity)getActivity()).getTextForLabel();
nameView.setText(str);

フラグメントとそのライフサイクルに関するドキュメントをお読みください。

于 2012-06-27T07:29:40.400 に答える
0

このようにインフレータを初期化しましたか、

     inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);

これをチェックしてください。プロジェクトをきれいにして実行してください....

于 2012-06-26T11:54:28.687 に答える
0

私もこの問題を抱えていました。

上記のコードは、クラスのonActivityCreated()メソッドにその部分を記述するだけです。Fragmentそのようにして私は問題を解決しました。

于 2012-06-26T11:56:19.940 に答える