我对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"/>
有关您的信息,保留片段的活动永远不会被暂停/终止。位置服务在后台运行时始终可见。所以在这个过程中,我认为片段不会被破坏。
我是否错误地接近了这个问题?有没有更好的方法来访问或保存片段的上下文并在以后使用它?任何提示都会有所帮助。
提前致谢。
答案 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();
};