在片段中的onCreateView方法之外,上下文更改为null

时间:2014-02-14 05:50:03

标签: android android-fragments

我对Android比较陌生。我正在编写一个在主要活动中使用片段的应用程序。此片段也像位置侦听器一样,并实现onLocationChange方法。这是因为,根据位置更改,新文本视图将添加到此片段中。

片段中的onCreateView方法创建了滚动视图,并添加到主活动中。在同一个onCreateView方法中,我还捕获了片段布局xml中存在的上下文和线性布局标记,我想在其中插入在onLocationChange方法中创建的文本视图。

我看到的问题是onLocationChanged方法和updateView方法中的上下文和布局值为null。使用调试器我确认它们只在onCreateMethod中有非空值。

以下是片段类的代码片段:

public class ResultsFragment extends Fragment implements LocationListener,OnCompleteListener {

private LoadPlaces loadPlaces;
HashMap<String, Double> map=new HashMap<String, Double>();
LinearLayout layout;
Context context;
Activity activity;
ScrollView view;

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
    Bundle savedInstanceState) {
    view =(ScrollView)inflater.inflate(R.layout.scroll_view, container, false);
    layout=(LinearLayout)view.findViewById(R.id.resultsView);
    context=view.getContext();

    return view;
 }

@Override
public void onLocationChanged(final Location location) {
    loadPlaces=new LoadPlaces(context); //context is null here
    loadPlaces.setOnCompleteListener(this);
    loadPlaces.execute(String.valueOf(location.getLatitude()),String.valueOf(location.getLongitude()));
}

private void updateResultView(){
    String status=loadPlaces.getResultStatus();
    if("OK".equals(status)){
        for (Place p:loadPlaces.getPlacesResult()){
            TextView txt=new TextView(context); //context is null here
            txt.setText(p.name);
            txt.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.WRAP_CONTENT));
            layout.addView(txt); //layout is null here
        }   
    }
}


@Override
public void onComplete(String result) {
    updateResultView();
}

这是片段的布局xml:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/results"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:fillViewport="true"
android:scrollbars="vertical"
android:scrollbarAlwaysDrawVerticalTrack="true"
android:clickable="true"
android:background="@color/grey"
android:layout_marginTop="25dip">

<LinearLayout android:id="@+id/resultsView"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">                  
 </LinearLayout>

这是主要活动的xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:padding="30dip" 
android:layout_gravity="center"
android:background="@color/background">
 <fragment android:name="com.app.xxx.ResultsFragment"
          android:id="@+id/headlines_fragment"
          android:layout_weight="1"
          android:layout_width="fill_parent"
          android:layout_height="0dp"/>

有关您的信息,保留片段的活动永远不会被暂停/终止。位置服务在后台运行时始终可见。所以在这个过程中,我认为片段不会被破坏。

我是否错误地接近了这个问题?有没有更好的方法来访问或保存片段的上下文并在以后使用它?任何提示都会有所帮助。

提前致谢。

2 个答案:

答案 0 :(得分:1)

更改为:

@Override
public void onLocationChanged(final Location location) {
    if(getActivity()!=null){
    loadPlaces=new LoadPlaces(getActivity()); //context is null here
    loadPlaces.setOnCompleteListener(this);
    loadPlaces.execute(String.valueOf(location.getLatitude()),String.valueOf(location.getLongitude()));
    }
}

问题是在onCreateView之前调用位置更改侦听器。

您可以忽略所有onLocationChanged调用,直到使用上面的函数将片段附加到Activity。

答案 1 :(得分:0)

public void onAttach(android.app.Activity activity) {
    super.onAttach(activity);
    context = (Context)getActivity();
};