0

뷰 팝업 (이클립스 마법사로 자동 생성)을 호스팅하는 탭 활동이 있습니다. 각 탭에서 특정 조각을 인스턴스화하기 위해 자동 생성 된 FragmentPagerAdapter를 약간 수정했습니다. 처음에는 4 탭, 첫 번째 탭에 대한 3 조각 및 여전히 마지막에 자동 생성 된 자리 표시 자, 그들은 일했다. 마지막 단락의 자리 표시자를 내 단편의 인스턴스로 바꿨을 때 다음 두 가지 탭 중 하나의 단편이 비어있게됩니다. | |ViewPager 내부에 하나의 조각이 표시되지 않습니다.

[MasterFragment] [RequestMap] [MasterFragment] [MasterFragment]

이 _____________________ 빈 유지

또한 "임의의"동작 순서 (탭을 변경하고 버튼을 클릭하여 몇 가지 작업을 수행하면 스왑을 표시하지 않는 조각을 만들 수 있으며 다음과 같이 마지막 조각이됩니다) :

_____1st TAB ___ | ____ 2 번째 TAB_ | ___ 3 번째 TAB _____ | ____ 4 번째 TAB ____ | |

[MasterFragment] [RequestMap] [MasterFragment] [MasterFragment]

이 __________________________________ 빈 유지 이클립스 마법사에서 생성 된 같은 자동이기 때문에이 viewPager의 설정에 관한 코드를 생략

public class SectionsPagerAdapter extends FragmentPagerAdapter { 

    public SectionsPagerAdapter(FragmentManager fm) { 
     super(fm); 
    } 

    @Override 
    public Fragment getItem(int position) { 
     switch (position) { 
     case REQUEST_TAB: 
      masterFragment = new MasterFragment(MasterFragment.ALL_REQUEST); 
      return masterFragment; 
     case MAP_TAB: 
      requestMap = new RequestMap(); 
      return requestMap; 
     case OWNER_TAB: 
      masterFragmentOwner = new MasterFragment(MasterFragment.OWNER_REQUEST); 
      System.out.println("I should have created the Owner MasterFragment"); 
      return masterFragmentOwner; 
     case JOINED_TAB: 
      masterFragmentJoined = new MasterFragment(MasterFragment.JOINED_REQUEST); 
      return masterFragmentJoined; 
     } 
     return null; 
    } 

    @Override 
    public int getCount() { 
     return 4; 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     Locale l = Locale.getDefault(); 
     switch (position) { 
     case REQUEST_TAB: 
      return getString(R.string.request_tab_title).toUpperCase(l); 
     case MAP_TAB: 
      return getString(R.string.map_tab_title).toUpperCase(l); 
     case OWNER_TAB: 
      return getString(R.string.owner_tab_title).toUpperCase(l); 
     case JOINED_TAB: 
      return getString(R.string.joined_tab_title).toUpperCase(l); 
     default: 
      return ""; 
     } 
    } 
} 

:

여기 내 FragmentPagerAdapter의 코드입니다. 여기에 MasterFragment 클래스의 코드가있는 동안 : 나는 중요한 뭔가를 누락하는 경우

package it.polimi.frontend.fragment; 

import it.polimi.appengine.entity.manager.model.Request; 
import it.polimi.appengine.entity.manager.model.User; 
import it.polimi.frontend.activity.R; 
import it.polimi.frontend.util.QueryManager; 
import it.polimi.frontend.util.QueryManager.OnRequestLoadedListener; 

import java.util.ArrayList; 
import java.util.List; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.view.InflateException; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class MasterFragment extends Fragment implements OnRequestLoadedListener, RequestList.OnRequestSelectedListener, RequestDetail.OnUserClickedListener{ 

private boolean twoPane; 
private static View view; 
public final static int ALL_REQUEST=0; 
public final static int OWNER_REQUEST=1; 
public final static int JOINED_REQUEST=2; 
private int mode; 

public MasterFragment(){ 
    this.mode=0; 
} 
public MasterFragment(int mode){ 
    this.mode=mode; 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    QueryManager.getInstance().addListener(this); 
    if (view != null) { 
     ViewGroup parent = (ViewGroup) view.getParent(); 
     if (parent != null) 
      parent.removeView(view); 
    } 
    try { 
     view = inflater.inflate(R.layout.fragment_master,container, false); 
     List<Request> requests = new ArrayList<Request>(); 
     RequestList requestListFragment = null; 
     switch (mode) { 
     case OWNER_REQUEST: 
      requests = QueryManager.getInstance().getCurrentUser().getRequests(); 
      System.out.println("Dovrei aver recuperato le richieste dell'owner"); 
      break; 
     case JOINED_REQUEST: 
      String mail=null; 
      if (QueryManager.getInstance().getCurrentUser()!=null){ 
       User current =QueryManager.getInstance().getCurrentUser(); 
       mail = current.getPwAccount() != null ? 
         current.getPwAccount() 
         : current.getGmailAccount() != null ? 
           current.getGmailAccount() 
           : current.getFbAccount() != null ? 
             current.getFbAccount() 
             : null; 
       requests = QueryManager.getInstance().getUserPartecipation(mail); 
      } 
      else 
       requests = new ArrayList<Request>(); 
      break; 
     default: //ALL_REQUEST case and all the other possibilities 
      requests = QueryManager.getInstance().getRequests(); 
      break; 
     } 
     requestListFragment = new RequestList(requests, mode); 
     if (view.findViewById(R.id.detail_container) != null) {//TABLET CASE 
      twoPane = true; 
      getChildFragmentManager().beginTransaction() 
      .replace(R.id.request_list_container,requestListFragment,RequestList.ID) 
      .commit(); 

     } else { //PHONE CASE: 
      getChildFragmentManager().beginTransaction() 
      .replace(R.id.container,requestListFragment,RequestList.ID) 
      .commit(); 
     } 
    } catch (InflateException e) { 
     // is already there, just return view as it is 
     e.printStackTrace(); 
    } 
    return view; 
} 

@Override 
public void onRequestSelected(int position, Request request) { 
    if (twoPane) { 
     DetailContainerFragment detailContFrag = new DetailContainerFragment(request,mode); 
     getChildFragmentManager().beginTransaction() 
     .replace(R.id.detail_container, detailContFrag, DetailContainerFragment.ID).commit(); 
    } else { 
     switch (mode) {//This empty switch if for future changes 
     case OWNER_REQUEST: 
      break; 
     case JOINED_REQUEST: 
      break; 
     default://ALL_REQUEST    
      break; 
     } 
     RequestDetail fragment = new RequestDetail(request,mode); 
     Fragment reqList=getChildFragmentManager().findFragmentByTag(RequestList.ID); 

     getChildFragmentManager().beginTransaction() 
     .hide(reqList) 
     .addToBackStack(RequestDetail.ID) 
     .add(R.id.container,fragment,RequestDetail.ID) 
     .commit(); 
    } 
} 

@Override 
public void onUserClicked(User user,String requestId) { 
    if (!twoPane) { 
     FeedbackDetail fragment = new FeedbackDetail(user,this.mode,requestId); 
     Fragment reqDetail=getChildFragmentManager().findFragmentByTag(RequestDetail.ID); 

     getChildFragmentManager().beginTransaction() 
     .hide(reqDetail) 
     .addToBackStack(FeedbackDetail.ID) 
     .add(R.id.container,fragment,FeedbackDetail.ID) 
     .commit(); 

    } else { 
     /*DetailContainerFragment should take care of it*/ 
    } 
} 
@Override 
public void onRequestLoaded(List<Request> requests) { 
    System.out.println("Ho caricato: "+requests.size()); 
    RequestList requestListFragment = (RequestList)getChildFragmentManager().findFragmentByTag(RequestList.ID); 
    switch (mode) {//Also this switch is for future changes, but the requests list is anyway fetched and assigned to RequestList above 
    case OWNER_REQUEST: 
     //TODO 
     break; 
    case JOINED_REQUEST: 
     //TODO 
     break; 
    default: //ALL_REQUEST 
     if (requestListFragment!=null) 
      requestListFragment.setRequestAdapter(requests); 
     break; 
    } 
} 

} 

알려 주시기 바랍니다. 내가 콘솔에서 쇼를 위로 배치 System.out에, 그래서 "빈"조각이 생성되어 있어야 말을 잊었 , 그것은 자신의 onCreateView를 통과해야 : 는

편집 사전에 모두 감사합니다().

답변

0

버그를 발견했습니다. 문제는 정적 속성 때문에

private static View view; 

입니다. "정적"을 제거하면 다시 작동합니다. 사실 정적 인 속성이 클래스의 모든 인스턴스간에 공유되어야하기 때문에 실제로 처음과 마지막 탭에서 잠시 동안 작동 할 수있는 방법과 세 번째 탭에서 작동하지 못하는 방법을 지금도 설명 할 수 없습니다. ViewPager의 내부 때문에 문제는 인접한 동일한 MasterFragment에만 표시되는 것처럼 보였습니다. 다른 조각으로 인터리브 된 경우 문제가 발생했습니다.

관련 문제