Android 从OnCreateView方法外部访问片段视图

Android 从OnCreateView方法外部访问片段视图,android,android-fragments,Android,Android Fragments,我们已经四处搜索过了,但是他们中的每个人都在寻找onCreateView()方法,在该方法中,您可以通过充气器访问片段视图 public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved) { super.onCreateView(inflater, group, saved); View view = inflater.inflate(R.layout.photosfrag, gro

我们已经四处搜索过了,但是他们中的每个人都在寻找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)
改为这样做:

//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
引用,而是在视图膨胀时加载,而不是在需要时加载。

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

或使用
getActivity
方法。文档中的示例:
View listView=getActivity().findviewbyd(R.id.list)

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

如果有人试图从onCreateView之外的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();
     }
 }

您已经执行的操作有什么问题?它由于出现
空指针异常而崩溃
那么您应该在问题中包含崩溃日志,并确保指出日志中引用的行。日志在
MainActivity.onTrackSelected
中显示NPE,不是在
你的片段被调用的地方。setTitleText
…我认为崩溃可能是我在main活动中调用方法的地方。这是一个很好的方法,肯定比OP的方法更好。但与他的车祸无关。谢谢你的帮助。这是我引用片段的方式,我一定是做得不对尝试在引用片段之前使用if((getSupportFragmentManager.findFragmentBy[Id | Tag]!=null)。*getSupportFragmentManager如果使用兼容库,则使用getFragmentManager如果不使用,并且目标设置>3.0这只适用于
setTextViewNow()
是从
onCreateView()
调用的。如果
setTextViewNow()
是从侦听器调用的,则
视图
类成员将为空。