2013-02-15 4 views
3

У меня есть проблема, когда с помощью наблюдателя в фрагменте, я реализовал свой собственный TextViewObserver, и я wan't, чтобы вставить его в фрагмент:Использование наблюдателя в Fragment

public class TextViewObserver extends TextView implements Observer { 

public TextViewObserver(Context context, AttributeSet attrs, int defStyle) { 
    super(context, attrs, defStyle); 
} 

public TextViewObserver(Context context, AttributeSet attrs) { 
    super(context, attrs); 
} 

public TextViewObserver(Context context) { 
    super(context); 
} 

@Override 
public void update(java.util.Observable o, Object arg) { 
    // TODO Auto-generated method stub 
    this.setText(String.valueOf(arg)); 

} 

Мой фрагмент кода :

public class MyFragment extends Fragment { 
private TextViewObserver mTextView;// = new TextView(this.getActivity()); 
private ApplicationContext mContext; 
private DataObservable mDataObservable; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_6, container, false); 
    mTextView = (TextViewObserver) view.findViewById(R.id.sicthtxtview); 
    return view; 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    mContext = (ApplicationContext) activity.getApplicationContext(); 
    mDataObservable = mContext.getObservable(); 

} 

@Override 
public void onStart() { 
    super.onStart(); 
    mDataObservable.addObserver(mTextView); 
} 

Мои DataObservable в моем классе ApplicationContext (расширение применения):

public class ApplicationContext extends Application { 

private DataObservable _mData; 

@Override 
public void onCreate() { 
    super.onCreate(); 
    _mData = new DataObservable(); 
} 

public DataObservable getObservable() { 
    return _mData; 
} 

MyText ViewObserver должен быть уведомлен при изменении DataObservable и в результате setText в фрагменте. Это ошибка задается LogCat:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 

Thx

+1

Это много кода для очень простой задачи, не так ли? Я бы порекомендовал взглянуть на эту библиотеку: http://square.github.com/otto/ – Piotr

ответ

3

В Android можно управлять только View с от потока пользовательского интерфейса. Вы можете запустить код в потоке пользовательского интерфейса с помощью View.post(), например:

@Override 
public void update(java.util.Observable o, final Object arg) { 
    this.post(new Runnable() { 
     public void run() { 
      this.setText(String.valueOf(arg)); 
     } 
    } 
} 

http://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable)

+0

Отлично, это хорошо работает, THX! – JSHeb