2011-05-10 4 views
39

예상대로 onCreateView 내부에 뷰를 생성하는 조각이 있습니다. 그러나 나는 정기적으로보기를 바꾸고 싶다.조각 내에서보기를 어떻게 변경합니까?

웹 서비스의 일부 데이터가 조각에 표시되는 경우를 예로 듭니다. 사용자가 목록 (다른 단편)에서 옵션을 선택하면이 단편은 진행 표시 줄으로 전환 한 다음로드되면 다시 데이터보기로 전환해야합니다.

로딩 단편과 표시 단편 두 개의 단편을 만들 수 있지만 캡슐화 된 이벤트이므로 하나의 단편 안에 모두 넣을 수 있습니다.

기본적으로 내가 묻는 것은 조각 내부에있는 setContentView의 동일성입니다.

답변

31

Fragment.getView()을 사용할 수 있습니다. Fragment이 포함 된 컨테이너 뷰를 반환합니다. 이보기에서 removeAllViews으로 전화 할 수 있습니다. 그런 다음 새보기를 작성하고 getView()에서 가져온보기에 추가하십시오.

http://developer.android.com/reference/android/app/Fragment.html#getView()

+2

이 답변은 기술적으로 올바르지 않습니다. 'getView()'는'View' 컨테이너가 아닌'onCreateView()'에 제공된'View'를 반환합니다. –

+0

좋은 지적입니다. 그것은 여전히 ​​@monkjack의 질문에 대한 대답입니다. – bplayer

+0

'getView()'는 뷰를 리턴하지만'removeAllViews()'메소드를 가지고 있지 않습니다. 그 방법은'ViewGroup'에있는 것 같습니다. 내가 놓친 게 있니? – Tim

4

당신은 예를 들어, 귀하의 진행률 표시 줄과 데이터보기 사이를 전환 할 FrameLayout을 사용할 수 있습니다 그런 다음 인스턴스에 두보기를 저장하는 것 onViewCreate()에서

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <ImageView android:id="@+id/cover_image" 
     android:scaleType="fitCenter" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" /> 
    <ProgressBar android:id="@+id/cover_progress" 
     android:layout_height="wrap_content" 
     android:layout_width="wrap_content" 
     android:layout_gravity="center"/> 
</FrameLayout> 

public View onCreateView(LayoutInflater inflater, 
     ViewGroup container, Bundle savedInstanceState) { 
    ... 
    image = (ImageView) container.findViewById(R.id.cover_image); 
    progress = container.findViewById(R.id.cover_progress); 
    ... 
} 

필드와 두 사이를 전환 할 때마다 (당신의 UI/메인 스레드에서이 작업을 수행하는 기억), 뭔가를 할 like

progress.setVisibility(View.INVISIBLE); 
image.setVisibility(View.VISIBLE); 
+1

'ViewSwitcher'도이 상황에서 편리합니다 –

+0

view.findViewById (R.id.cover_image); 변수 "보기"란 무엇입니까? – Montaro

+1

@Montaro는 '컨테이너'였을 것입니다. 답안에서 수정되었습니다. 감사! –

1

U는 트랜잭션 제거 및 추가를 사용할 수 있습니다. 어떤 뷰를로드 할 수있는 Fragment를 사용했습니다. 조각의 생성자는 정수 여야합니다. 그 정수는 R.layout .... 그냥 이전 조각을 제거하고 새로운 것을 넣으십시오. !!! 이 조각을 xml 레이아웃이 아닌 동적으로 만드는 경우에만 작동합니다. 어떤 이유로, 당신은 (예를 들어, 성공의보기를 변경합니다 비동기 URL 요청을) 전체 조각보기를 변경하려면 그냥있는 LinearLayout R.id.fragment_layout

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 

    setContentView(R.layout.wundlist_fragmente); 
    Log.v("WoundListActivity", "WoundListActivity gestartet..."); 

    Log.v("WoundListActivity", "Liste..."); 
    //dynamisch hinzufügen... 
    wlf=new WoundListFragment();   
    fm.beginTransaction().add(R.id.fragment_layout,wlf).commit(); 

} 

//If Menubutton Clicked change 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    if(item.getItemId()==R.id.itemaddwound){ 
     Log.v("List", "neue Wunde Activity"); 

     fm.beginTransaction().remove(wlf).commit(); 
     fm.beginTransaction().add(R.id.fragment_layout, new NewWoundFragment()).commit(); 

    } 

    return super.onOptionsItemSelected(item); 
} 
24

같은 것을 만들, 당신은 할 수 상위 액티비티에서 FragmentTransaction을 사용하고 즉시 새 프래그먼트를 생성하십시오.

또는 조각을 유지하고 자체를 새로 고치는이 조각의 메서드를 호출 할 수 있습니다. 예 : 상위 액티비티에서는 조각 List<RefreshFragment> mFragmentList의 목록을 작성하고 저장합니다. 여기

는 RefreshFragment 클래스입니다 (내 모든 조각 내 예에서이 일 연장) :
public class RefreshFragment extends Fragment { 
    protected Data data; // here your asynchronously loaded data 

    public void setData(Data data) { 
     this.data = data; 
     // The reload fragment code here ! 
     if (! this.isDetached()) { 
      getFragmentManager().beginTransaction() 
       .detach(this) 
       .attach(this) 
       .commit(); 
     } 
    } 
} 

그런 다음 내 활동 비동기 콜백에 내가 전화를 할 수 있습니다 :

for (RefreshFragment f : mFragmentList) f.setData(data); 

그래서 모든 조각 것 올바른 데이터로 업데이트되고 현재 첨부 된 조각이 즉시 업데이트됩니다. 당신은 물론 당신의 onCreateView를 조각에 제공해야합니다.

중요한 것은 조각이 getFragmentManager()으로 다시로드 될 수 있다는 것입니다.

+0

그게 나를 위해 작동합니다. 감사. – Jacek

+0

문제는 데이터를로드하거나 사용자가 버튼을 클릭 할 때 단편이 분리되지 않는다는 것입니다 ... –

+0

@Waza_Be 유형이라고 생각하며 다음과 같아야합니다 :'if (! this.isDetached()) {' . – sulai

-1

나를 위해 일한 것을이 :

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View v = inflater.inflate(R.layout.fragment_recipe, container, false); 
    Button recipeBuyButton = (Button) v.findViewById(
      R.id.recipe_buy_button); 
    Typeface tf = Typeface.createFromAsset(getActivity().getAssets(), "fonts/GE_SS_Two_Medium.otf"); 
    recipeBuyButton.setTypeface(tf); 
    return v; 
+1

사람들이 정답에 대해 부정 투표를하는 이유는 무엇입니까? 이 대답에 잘못된 것은 없습니다. 내 편에서 +1. –

+0

이 답변은 현재의 질문과 아무런 관련이 없기 때문에. – Sierisimo

1

이 Solostaran14s 응답을 사용하여 내가 지금이 일을하고있다 :

인터페이스 :

public interface FragmentReattachListener { 

    public void reAttach(); 

} 

조각 :

public class MyFragment extends Fragment implements FragmentReattachListener { 
//... 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    //... 
    App.registerFragmentReattachListener(this); 
    //... 
} 

//...  

@Override 
public void reAttach() { 
    FragmentManager f = getFragmentManager(); 
    if (f != null) { 
     f.beginTransaction() 
        .detach(this) 
        .attach(this) 
        .commit(); 
     } 
    } 

} 

응용 프로그램에서클래스 :

private static void reattachFragments() { 
     if (fragmentReattachListeners.size() > 0) { 
      for (FragmentReattachListener listener : fragmentReattachListeners) { 
       listener.reAttach(); 
      } 
     } 
    } 
+0

승인 : 더 나은 인터페이스. – Solostaran14

-1

내가 fragment.getView을 (같은 문제가) 항상 내 조각이 추가 되었기 때문에 우리는 런타임에 단편의 내용을 변경할 수 없습니다

전에 Fragment.onCreateView 이미 호출되었지만, null를 돌려줍니다 ViewPager 그래서 내가보기를 얻기 위해 다른 방법을 사용하려고 :

View view = viewPager.getChildAt(0); 
TextView text = (TextView) (view.findViewById(R.id.textView)); 
text.setText("12345"); 

지금은 "더미"기본보기를 작성하면

2

을 도울 수 있기를 바랍니다, resoloved 된이 문제

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

</LinearLayout> 

조각의 onCreateView 방법의 "더미"기본보기를 부풀려 당신이 먼저 이전을 제거 새로운보기로보기를 변경하려면

private LayoutInflater mInflater; 
private ViewGroup mContainer; 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState){ 
    mInflater = inflater; 
    mContainer = container; 

    View v =inflater.inflate(R.layout.home_view,container,false); 
    placeholder = (ViewGroup) v; 

    return placeholder; 
} 

을 필요에 따라 뷰를 추가 할 자리로 사용 뷰는 새보기를 팽창하고 여기에 간단한 솔루션입니다

View newView = mInflater.inflate(R.layout.custom_dash, mContainer, false); 
placeholder.removeAllViews(); 
placeholder.addView(newView); 
1

추가 : onCreateView에서받는 인플레이터 및 컨테이너를 저장하고 나중에 사용할 수 있습니다. 예 :

private LayoutInflater mInflater; 
private ViewGroup mRootView; 

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    mInflater = inflater; 
    mRootView = container; 
    return null; 
} 

public void someCallBackLater() { 
    // mRootView.removeAllViews(); // in case you call this callback again... 
    mInflater.inflate(R.layout.my_layout, mRootView); 
} 
관련 문제