5

これを検索しましたが、それらのすべては、インフレータを介して Fragments ビューにアクセスできる onCreateView() メソッドを対象としています。

public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved)
{
    super.onCreateView(inflater, group, saved);
    View view = inflater.inflate(R.layout.photosfrag, group, false);

私が知りたいのは、これを動的に行う方法です。たとえば、アクティビティを使用してフラグメントを表示し、次のようなフラグメント内のメソッドを呼び出すとします。

public void setTitleText(String title) {
    TextView nameView = (TextView)getView().findViewById(R.id.titleTxtView);
    nameView.setText(title);
}

フラグメントがすでに作成されており、動的に変更する方法であるという理由だけで。

どんな助けも素晴らしいでしょう。私はそれをすべて間違っているかもしれません。

編集

クラッシュログはこちら

06-25 17:31:37.343: D/AndroidRuntime(1009): Shutting down VM
06-25 17:31:37.353: W/dalvikvm(1009): threadid=1: thread exiting with uncaught exception (group=0x409c01f8)
06-25 17:31:37.383: E/AndroidRuntime(1009): FATAL EXCEPTION: main
06-25 17:31:37.383: E/AndroidRuntime(1009): java.lang.NullPointerException
06-25 17:31:37.383: E/AndroidRuntime(1009):     at com.corecoders.stuart.MainActivity.onTrackSelected(MainActivity.java:81)
06-25 17:31:37.383: E/AndroidRuntime(1009):     at com.corecoders.stuart.HistoryFragment.onListItemClick(HistoryFragment.java:51)
06-25 17:31:37.383: E/AndroidRuntime(1009):     at android.app.ListFragment$2.onItemClick(ListFragment.java:160)
06-25 17:31:37.383: E/AndroidRuntime(1009):     at android.widget.AdapterView.performItemClick(AdapterView.java:292)
06-25 17:31:37.383: E/AndroidRuntime(1009):     at android.widget.AbsListView.performItemClick(AbsListView.java:1058)
06-25 17:31:37.383: E/AndroidRuntime(1009):     at android.widget.AbsListView$PerformClick.run(AbsListView.java:2514)
06-25 17:31:37.383: E/AndroidRuntime(1009):     at android.widget.AbsListView$1.run(AbsListView.java:3168)
06-25 17:31:37.383: E/AndroidRuntime(1009):     at android.os.Handler.handleCallback(Handler.java:605)
06-25 17:31:37.383: E/AndroidRuntime(1009):     at android.os.Handler.dispatchMessage(Handler.java:92)
06-25 17:31:37.383: E/AndroidRuntime(1009):     at android.os.Looper.loop(Looper.java:137)
06-25 17:31:37.383: E/AndroidRuntime(1009):     at android.app.ActivityThread.main(ActivityThread.java:4424)
06-25 17:31:37.383: E/AndroidRuntime(1009):     at java.lang.reflect.Method.invokeNative(Native Method)
06-25 17:31:37.383: E/AndroidRuntime(1009):     at java.lang.reflect.Method.invoke(Method.java:511)
06-25 17:31:37.383: E/AndroidRuntime(1009):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-25 17:31:37.383: E/AndroidRuntime(1009):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-25 17:31:37.383: E/AndroidRuntime(1009):     at dalvik.system.NativeStart.main(Native Method)
4

5 に答える 5

3

あなたがやっている方法はうまくいくはずです。クラッシュ ログは、NPEがフラグメントがそのウィジェットを更新する方法とは無関係であることを示しています。

于 2012-06-25T16:56:45.833 に答える
2

代わりにこれを行ってください:

//Define reference globally
TextView nameView;

public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved){
    super.onCreateView(inflater, group, saved);
    View view = inflater.inflate(R.layout.photosfrag, group, false);
    //do this here!
    nameView = view.findViewByID(R.id.titleTxtView);
    ...

}

public void setTitle(String t){
    nameView.setText(t);
}

違いは、このアプローチでは参照が遅延ロードされないTextViewことです。ビューが必要なときではなく、ビューが膨らんだときにロードされます。

于 2012-06-25T16:41:40.003 に答える
2

誰かが onCreateView の外にある Fragment のクラスの Fragment のレイアウトから任意のビューにアクセスしようとしている場合、クラス レベルで宣言された膨張ビューを作成し、膨張ステートメントの後にリンクし、そのビュー参照を使用して Fragment クラスのどこかでビューを見つけることができます。 ..........

 public class FragmentA extends Fragment implements onClickListener{

//This will hold the inflated fragment layout

    private View view;

public FragmentA() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    // Inflate the layout for this fragment


    View view = inflater.inflate(R.layout.fragmenta, container, false);
    this.view= view;// link this 'view'  to our  'view' which we declared in class               

    setTextViewNow();
    // or from a button click 
          Button button = view.findViewById(R.id.button);
          button.setOnClickListener(this)

    return view;

}

private void setTextViewNow() {

    //use 'view' to find the id of textview using findviewById();   
     if(view !=null){
    TextView myView = (TextView)view.findViewById(R.id.textViewMyView);
    myView.setText("THis is set from outside oncreateView");           
        }
   }

    @Override
    public void  onClick(View view){
       setTextViewNow();
     }
 }
于 2014-08-20T06:53:32.240 に答える
1

私は同様の問題を抱えていました.FragmentのgetItem(int)メソッドをオーバーライドし、毎回Fragmentの新しいインスタンスを返していたことがわかりました.あなたの場合、あなたもそれをオーバーライドしているかどうかはわかりませんがHistoryFragment.onListItemClick、メソッドを呼び出して、getItem画面に表示されているものとは異なる Fragment の新しいインスタンスを返しています。

于 2012-07-29T06:30:20.493 に答える
-1

またはgetActivityメソッドを使用します。ドキュメントからの例: View listView = getActivity().findViewById(R.id.list);

于 2012-06-25T19:11:36.880 に答える