2012-07-31 5 views
17

を取得することはできません。今私は私の活動の中で、私がnewFragmentに持っているレイアウトで置き換える必要がある動的な文字列を知っています。私はアンドロイド:フラグメントは、私は正常に動作フラグメント取引</p> <pre><code>DetailFragment newFragment = new DetailFragment(); transaction.replace(R.id.mylist, newFragment); transaction.addToBackStack(null); transaction.commit(); </code></pre> <p>をする活性を有する活動

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

ポイントはgetActivity()がnullを返すということである持っている私は()transaction.commit後

newFragment.setMyString("my dynamic value"); 

好きnewFragment.java内だけで何かを呼び出すことができると考えました。レイアウト要素を見つけるために必要なコンテキストを取得するにはどうすればよいですか?

編集:

私は、これはクリーンな方法であると思われるようバンドルを使用してルートをたどるようにしてください。だから私は私のコードを変更しました。このようになりますonCreateView

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(); 

マイフラグメント:

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を逃しました。今働いている。

答えて

17

あなたFragmentまたあなたのレイアウトがhasnを意味し、まだActivityに添付されていませんまだ膨らんでいない(Fragment lifecycleを参照)。ここでの最適な解決策は、Fragmentの引数としてStringの値をFragment.setArguments(Bundle)メソッドで追加することです。これはFragmentFragment.getArguments()メソッドで取得できます。

+1

私のレイアウトは膨らんでいますonViewCreatedが呼び出されます。私は私のレイアウトを見ることができます。 – AndyAndroid

2

だから私も同じフラグメントのトランザクションマネージャを使用していますし、私はあなたのコードを見ることができる唯一の問題は、あなたのnewFragmentクラスのごonCreateViewメソッド内のTextViewテレビを定義し、このようなとしてそれをインスタンス化することである:

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); 
    } 
} 

は、私はそれが本当にあまり意味がdoes'nt知っているが、私は私のコードを実行していますどのようにそれがあり、それが正常に動作します:)

+0

それは重要だと分かっています:)それを変更しました。うまくいけば、今よりよく見える – Android2390

+3

もちろん、あなたのコードをインデントすることは、StackOverflowでは重要です...人々はあなたが非常に信頼できる情報源であるとは思わないでしょうコードは大雑把に読めません。私はあなたの答えを編集し、downvoteを削除しました。 –

20

onAttach()以降のgetActivity()に電話することを忘れないでください。以前と同じようにnullが返されます。 uはOnCreateViewでgetActivityを呼び出す必要がある場合

+0

私はどこでgetActivity()を呼び出して、それを私のsetMyString()関数に渡すのか分かりません。あなたがまだ書いているところに書いておけば、それはnullを返すかもしれないし、返さないかもしれない。これをどうやって理解するのですか? – AndyAndroid

+6

'onActivityCreated' ...' onActivityCreated'まで 'フラグメント'は 'null'アクティビティにアタッチされます。つまり、' onCreate'または 'onCreateView'で' getActivity() 'を呼び出すと'アクティビティはまだ作成されていません。だから、あなたが 'onActivityCreated'の後に' getActivity() '*を呼んだことを確認してください。 –

+4

これは間違っています。 onAttachが呼び出されると、getActivity()はnullを返さずに呼び出すことができます。 onActivityCreatedは、アクティビティが完全に作成され、フラグメントのレイアウトがインスタンス化されたときの単なるコールバックです。 – dymmeh

0

は、onActivityCreateにonCreateViewからすべてのウルのコードを移動し、唯一の左ラインonCreateView

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

しかし、私は面白い状況があります。マイ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で

関連する問題

 関連する問題