5

已经搜索过这个,但他们每个人都是 onCreateView() 方法,您可以通过充气器访问 Fragments 视图。

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

我遇到了类似的问题,原来我正在覆盖getItem(int)Fragment 的方法并每次都返回一个新的 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 回答