gpt4 book ai didi

android - 在 fragment 中的 onCreateView 方法之外,上下文更改为 null

转载 作者:行者123 更新时间:2023-11-29 01:45:34 26 4
gpt4 key购买 nike

我是 Android 的新手。我正在编写一个在主要 Activity 中使用 fragment 的应用程序。此 fragment 还充当位置监听器并实现 onLocationChange 方法。这是因为,基于位置的变化,新的 TextView 被添加到这个 fragment 中。

fragment 中的 onCreateView 方法创建了 ScrollView ,并将其添加到主 Activity 中。在同一个 onCreateView 方法中,我还捕获了 fragment 的布局 xml 中存在的上下文和线性布局标记,我想在其中插入在 onLocationChange 方法中创建的 TextView 。

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

这是 fragment 类的代码 fragment :

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

这是 fragment 的布局 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>

这是主要 Activity 的 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"/>

供您引用,保存 fragment 的 Activity 永远不会暂停/终止。当位置服务在后台运行时,它始终可见。所以在这个过程中,我认为 fragment 不会被破坏。

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

提前致谢。

最佳答案

更改为:

@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 调用,直到您的 fragment 使用上述函数附加到 Activity。

关于android - 在 fragment 中的 onCreateView 方法之外,上下文更改为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21771766/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com