2013-02-28 39 views
18

Tôi có một viewPager đơn giản với hai đoạn. Mỗi mảnh chứa một TextView. Tôi muốn có thể cập nhật văn bản của textView hiện tại được hiển thị từ hoạt động.Làm cách nào để cập nhật nội dung phân đoạn khỏi hoạt động (chế độ xem)?

Hoạt động:

public class MainActivity extends FragmentActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_activity); 

     ArrayList<Fragment> fragments = new ArrayList<Fragment>(); 
     fragments.add(Fragment.instantiate(this, Live.class.getName())); 
     fragments.add(Fragment.instantiate(this, Hit.class.getName())); 

     this.pagerAdapter = new MyPagerAdapter(getSupportFragmentManager(),fragments); 

     ViewPager pager = (ViewPager) findViewById(R.id.viewpager); 
     pager.setAdapter(pagerAdapter); 
    } 
} 

Adaptor:

public class MyPagerAdapter extends FragmentPagerAdapter { 

    private final ArrayList<Fragment> fragments; 

    public MyPagerAdapter(FragmentManager fm, ArrayList<Fragment> fragments) 
    { 
     super(fm); 
     this.fragments = fragments; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     return this.fragments.get(position); 
    } 

    @Override 
    public int getCount() { 
     return this.fragments.size(); 
    } 
} 

Fragment:

public class Live extends Fragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.live, container,false); 
    } 
} 

XML Fragment:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent"> 
    <TextView android:layout_height="fill_parent" 
       android:layout_width="fill_parent" 
       android:text="First Fragment" 
       android:id="@+id/status"/> 
</LinearLayout> 

Mỗi đoạn có một TextView với id "trạng thái". Cập nhật chế độ xem văn bản trong onCreateView hoạt động. Nhưng làm thế nào tôi có thể cập nhật textView từ bất cứ nơi nào trong hoạt động?

Tôi đã cố gắng này mà không có succes:

Fragment:

public class Live extends Fragment {  
    public TextView tv; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.live, container,false); 
     tv = (TextView) view.findViewById(R.id.status); 

     return view; 
    } 
} 

Hoạt động:

@Override 
    protected void onResume() { 
     super.onResume(); 
     Live frag = (Live) pagerAdapter.getItem(0); 
     frag.tv.setText("Test 2"); 
    } 

Nhưng nó mang lại cho tôi một NullPointerException trên tv, có lẽ vì các mảnh vỡ chưa tăng cao.

Tôi đã đọc các câu hỏi sau đây mà không thành công:

Trả lời

7

Trong lớp MyPagerAdapter của bạn, Android gọi getItem(...) chỉ khi nó muốn tạo ra mảnh vỡ mới. Vì vậy, nó là vấn đề để sử dụng tài liệu tham khảo có thay vào đó bạn nên instatiate các mảnh vỡ.

Kiểm tra này trả lời support-fragmentpageradapter-holds-reference-to-old-fragments

+3

này là 100% đúng. Tôi đã phạm sai lầm tương tự như OP. KHÔNG giữ mảng của riêng bạn 'Fragment's.'FragmentManager' trong' FragmentPagerAdapter' nắm giữ tất cả 'Fragment's và quản lý việc lưu và phục hồi trạng thái của chúng. Chúng cũng có thể được tham chiếu - http://stackoverflow.com/questions/8785221/retrieve-a-fragment-from-viewpager/14530629#14530629. –

+1

Ok đã sử dụng: http://tamsler.blogspot.fr/2011/10/android-viewpager-and-fragments.html và giải pháp thứ hai của http://tamsler.blogspot.fr/2011/11/android-viewpager -and-fragments-part-ii.html. Nhưng từ những gì tôi đã có kinh nghiệm nó không thể truy cập vào đoạn trong ngày tạo hoặc tiếp tục trong hoạt động phải không? – grunk

+0

Nó có lẽ không phải là awailable/inflated tại thời điểm đó. Tại sao bạn không sử dụng vòng đời của những mảnh vỡ? – faceman

1
@Override 
    public int getItemPosition(Object object) { 
    XXXFragment fragment = (XXXFragment) object; 
     if(…condition){ 
    fragment.refresh(…); 
    } 
     return super.getItemPosition(object); 
    } 

ghi đè bên trên. khi bạn gọi notifyDataSetChanged(), phương thức trên được kích hoạt. làm mới của bạn khi bạn có thể.

2

tôi giải quyết vấn đề này như thế này, tạo ra các bộ chuyển đổi như thế này

package com.yubraj.sample.adapter; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentStatePagerAdapter; 

import com.yubaraj.sample.activities.RashiFragment; 
import java.util.List; 


public class PageSliderAdapter extends FragmentStatePagerAdapter { 
    static String[] titleList = new String[] { "today", 
      "this month", "this year" }; 
    List<String> rashi; 
    // private static String TAG = "pagerscreenslider"; 

    public PageSliderAdapter(FragmentManager fm, List<String> rashiList) { 
     super(fm); 
     this.rashi = rashiList; 
    } 
    public void updateData(List<String> rashisList){ 
     rashi.clear(); 
     this.rashi = rashisList; 
     notifyDataSetChanged(); 
    } 
    @Override 
    public int getItemPosition(Object object) { 
     // TODO Auto-generated method stub 
     return POSITION_NONE; 
    } 

    @Override 
    public Fragment getItem(int position) { 
     Fragment fragment = new RashiFragment(); 
     Bundle bundle = new Bundle(); 
     bundle.putString("RASHI", rashi.get(position)); 
     bundle.putInt("RASHI_TYPE", position); 
     fragment.setArguments(bundle); 
     return fragment; 
    } 

    @Override 
    public int getCount() { 
     return titleList.length; 
    } 

    @Override 
    public String getPageTitle(int position) { 
     return titleList[position]; 
    } 


} 

Sau đó, từ hoạt động của bạn

List<String> rashiCollection = getJSONFromDb(Dates); 
adapter.updateData(rashiCollection); 
Các vấn đề liên quan