2014-02-14 2 views
2

Я относительно новичок в Android. Я пишу приложение, которое использует фрагмент в основном действии. Этот фрагмент также действует как приемник местоположения и реализует метод onLocationChange. Это связано с тем, что на основе изменений местоположения к этому фрагменту добавляются новые текстовые представления.Контекст изменяется на нуль за пределами метода onCreateView во фрагменте

Метод onCreateView во фрагменте имеет свой вид прокрутки, созданный, который добавляется к основному действию. В том же методе onCreateView я также фиксирую контекст и тег линейного макета, который присутствует в макете xml фрагмента, где я хотел бы вставить текстовые представления, которые создаются в методе onLocationChange.

Проблема, которую я вижу, является контекстом, а значения макета равны нулю в методе onLocationChanged и методе updateView. Используя отладчик, я подтвердил, что они имеют ненулевые значения только в 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

Это неверный контекст = view.getContext(); он должен быть context = getActivity(); –

+0

, но зачем вам «контекстный контекст» и «активность активности»? «Активность» - это право «Контекста» ...? –

+0

Мне известно, что действие - это контекст. Причина, по которой у меня был view.getContext, и две отдельные переменные для активности и контекста - это только для целей тестирования, так как я получал нулевые значения. В конечном итоге я буду использовать только один из них. – Sriprabha

ответ

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, используя вышеуказанную функцию.

0
public void onAttach(android.app.Activity activity) { 
    super.onAttach(activity); 
    context = (Context)getActivity(); 
}; 
Смежные вопросы