19

フラグメントトランザクションを実行するアクティビティがあります

DetailFragment newFragment = new DetailFragment();
transaction.replace(R.id.mylist, newFragment);
transaction.addToBackStack(null);
transaction.commit();

それはうまくいきます。これで、アクティビティ内で、newFragmentのレイアウトで置き換える必要のある動的文字列がわかりました。私はtransaction.commit()の後に次のようなものを呼び出すことができると思いました

newFragment.setMyString("my dynamic value");

そして、newFragment.javaには

public void setMyString(String s)
{
 TextView tv = (TextView) getActivity().findViewById(R.id.myobject);
 tv.setText(s);
}

重要なのは、getActivity()がnullを返すことです。レイアウト要素を見つけるために必要なコンテキストを取得するにはどうすればよいですか?

編集:

これが最もクリーンな方法のように思われるので、私はバンドルを使用してルートをたどろうとします。だから私は私のコードを変更しました:

Bundle b = new Bundle();
b.putString("text", "my dynamic Text");
DetailFragment newFragment = new DetailFragment();
transaction.replace(R.id.mylist, newFragment);
transaction.addToBackStack(null);
transaction.commit();

私のフラグメントonCreateViewは次のようになります。

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{
   View v = inflater.inflate(R.layout.mylayout, container, false);
   TextView t = (TextView) v.findViewById(R.id.texttobereplaced);
   t.setText(savedInstanceState.getString("text");
}

savedInstranceStateが空のようです。バンドルはどこにありますか?

Edit2:

応答でgetArguments()を見逃しました。現在動作しています。

4

4 に答える 4

20

前と同じように、を呼び出した後、getActivity()または後に呼び出してください。onAttach()null

于 2012-07-31T15:33:08.160 に答える
18

FragmentまだアタッチされていませActivityん。これは、レイアウトがまだ拡張されていないことも意味します(フラグメントのライフサイクルを参照)。ここでの最善の解決策は、メソッドを介してString引数として値を追加することです。これは、メソッドを介して受信時に取得できます。FragmentFragment.setArguments(Bundle)FragmentFragment.getArguments()

于 2012-07-31T15:19:23.100 に答える
2

したがって、同じフラグメントトランザクションマネージャーも使用しています。コードで確認できる唯一の問題は、newFragmentクラスのonCreateViewメソッド内でTextView tvを定義し、次のようにインスタンス化することです。

public class AboutFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.newFragment, container, false);
        TextView tv = (TextView) v.findViewById(R.id.textview);
        return v;
    }

    public void setMyString(String s) {
        tv.setText(s);
    }
}

私はそれがあまり意味をなさないことを知っていますが、それは私が私のコードを実行している方法であり、それはうまく機能します:)

于 2012-07-31T15:18:27.573 に答える
0

OnCreateViewでgetActivityを呼び出す必要がある場合は、すべてのurコードをonCreateViewからonActivityCreateに移動し、左側の行のみを移動します

View v = inflater.inflate(R.layout.xxxx, container, false);
    return v;

onCreateViewで

しかし、私は面白い状況にあります。

私のonActivityCreatedで

Spinner s1 = (Spinner) getActivity().findViewById(R.id.bitlength);
    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(
            getActivity(), R.array.bitlengths,
            android.R.layout.simple_spinner_item);
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    s1.setAdapter(adapter);

onActivityCreatedが(正しく!?)実行されないことがあるため、スピナーs1が空になります。

于 2013-03-24T18:55:45.763 に答える