从外部OnCreateView方法访问碎片视图

时间:2012-06-25 16:18:47

标签: android android-fragments

已经搜索过这个,但是每个人都在onCreateView()方法中,你可以通过inflater访问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)

5 个答案:

答案 0 :(得分:3)

你这样做的方式应该是有用的。崩溃日志向我们显示 NPE 与片段更新其小部件的方式无关。

答案 1 :(得分: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引用 - 它在视图膨胀时加载它而不是在需要时加载它。

答案 2 :(得分:1)

我遇到了类似的问题,结果我覆盖了Fragment的getItem(int)方法并且每次都返回一个新的Fragment实例,在你的情况下我不知道你是否也覆盖了它,但是,您应该检查HistoryFragment.onListItemClick以查看您是否正在调用getItem方法并返回一个新的Fragment实例,该实例与您在屏幕上显示的实例不同。

答案 3 :(得分:1)

如果有人试图从onCreateView外部的Fragment类中的片段布局访问任何视图,那么你可以在类级别声明膨胀视图并在膨胀语句后链接它并使用该视图引用在Fragment类中的任何位置查找视图:例如...........

public class FragmentA extends Fragment {

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

    return view;

}

private void setTextViewNow() {

    //use 'view' to find the id of textview using findviewById();   

    TextView myView = (TextView)view.findViewById(R.id.textViewMyView);
    myView.setText("THis is set from outside oncreateView");
}

}

答案 4 :(得分:-1)

或使用getActivity方法。来自doc的示例: View listView = getActivity().findViewById(R.id.list);