4

내 주요 활동에는 두 개의 탭이있는 ActionBar가 있습니다. 탭 1은 ListFragment이고 Tab 2는 HeaderListView 라이브러리를 사용하는 단편입니다. 앱을 열면 탭 1이 표시됩니다.) (조각으로 탭으로 돌아갈 때 충돌이 발생합니다. 같은 id로보기

09-12 13:19:22.440 21772-21772/com.iosharp.android.smoothstreams E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.iosharp.android.smoothstreams, PID: 21772 
    java.lang.IllegalArgumentException: Wrong state class, expecting View State but received class android.widget.AbsListView$SavedState instead. This usually happens when two views of different type have the same id in the same hierarchy. This view's id is id/header_list_view. Make sure other views do not use the same id. 

ID/header_list_view 만 탭 2 만 onCreateView에서 사용되는 방법 : 당신이 탭 2로 전환하면 다시 탭 1을, 그리고 마지막으로 다음과 같이 탭 2 응용 프로그램 충돌을 반환 탭 1에서는 팽창하지 않습니다. 여기에서 어디로 가야할지 난처합니다. 또한 무엇 내가 android.app.v4.support.Fragment

탭 2의 단편의 관련 부분을 사용하고 그 가치 : 조각의 인스턴스를 MainActivity의

public class ProgrammeListFragment extends Fragment { 
    private static final String TAG = ProgrammeListFragment.class.getSimpleName(); 
    private ArrayList<Programme> mProgrammes; 
    private ArrayList<Day> mDays; 
    private Date mNow; 
    private HeaderListView mHeaderListView; 
    static private SectionAdapter mAdapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mNow = new Date(); 

     mProgrammes = ProgrammeStore.get(getActivity()).getProgrammes(); 
     Collections.sort(mProgrammes, new Programme()); 
     mProgrammes = trimProgrammes(mProgrammes); 

     mDays = setupDays(mProgrammes); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, final ViewGroup container, Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.progamme_header_list, container, false); 
     mHeaderListView = (HeaderListView) v.findViewById(R.id.header_list_view); 
     mAdapter = new SectionAdapter() { 
      @Override 
      public int numberOfSections() { 
       return mDays.size(); 
      } 

      @Override 
      // TODO: sometimes -1 is passed as int section, this needs to be looked at later 
      public int numberOfRows(int section) { 
       if (section > -1) { 
        return mDays.get(section).getLineUp().size(); 
       } else { 
        return 1; 
       } 
      } 

      @Override 
      public View getRowView(int section, int row, View convertView, ViewGroup parent) { 
       convertView = getActivity().getLayoutInflater().inflate(
         R.layout.programme_list_item, null); 

       //set views 

       return convertView; 
      } 

      @Override 
      public Day getSectionHeaderItem(int section) { 
       return mDays.get(section); 
      } 

      @Override 
      public int getSectionHeaderItemViewType(int section) { 
       return super.getSectionHeaderItemViewType(section); 
      } 

      @Override 
      public boolean hasSectionHeaderView(int section) { 
       return true; 
      } 

      @Override 
      public View getSectionHeaderView(int section, View convertView, ViewGroup parent) { 
       convertView = getActivity().getLayoutInflater().inflate(R.layout.programme_list_header, null); 

       // set views 

       return convertView; 
      } 

      @Override 
      public Programme getRowItem(int section, int row) { 
       return mDays.get(section).getLineUp().get(row); 
      } 
     }; 

     mHeaderListView.setAdapter(mAdapter); 

     return v; 
    } 
} 

관련 부품 탭 :

을 TabListener 클래스의 두 가지 방법

그리고 만약을

public class MainActivity extends ActionBarActivity { 
    private static final String TAG = MainActivity.class.getSimpleName(); 

    private static final String KEY_TAB = "tab"; 

    private Fragment fragmentChannels = new ChannelListFragment(); 
    private Fragment fragmentProgrammes = new ProgrammeListFragment(); 

    private int mCurrentTab; 
    private ActionBar mActionBar; 
    private ArrayList<Channel> mChannels; 
    private ArrayList<Programme> mProgrammes; 
    private ProgressDialog mProgressDialog; 

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

     mActionBar = getSupportActionBar(); 
     mActionBar.setTitle(R.string.app_name); 
     mActionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS); 

     mActionBar.addTab(mActionBar.newTab().setText(R.string.channels_title).setTabListener(new TabListener(fragmentChannels))); 
     mActionBar.addTab(mActionBar.newTab().setText(R.string.programmes).setTabListener(new TabListener(fragmentProgrammes))); 


     // Get singletons 
     mProgrammes = ProgrammeStore.get(getApplication()).getProgrammes(); 
     mChannels = ChannelStore.get(getApplicationContext()).getChannels(); 

    } 
} 
내가 가진 :

public void onTabSelected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
     fragmentTransaction.replace(R.id.fragmentContainer, fragment); 
    } 

    public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction fragmentTransaction) { 
     fragmentTransaction.remove(fragment); 
    } 
+2

'수정'하는 이유는 모르겠지만 'mHeaderListView.setId()'를 통해 ID를 설정하면 onCreateView() 메소드의 ProgrammeListFragment에 문제가 없어집니다. 내가 설정 한 ID가 무의미한 것 같습니다. – aaearon

+0

이것도 나를 위해 작동합니다. 이게'HeaderListView' 문제인 것 같습니다. 'onCreateView'에서'listView.setId (-1);'을 설정하면 문제가 해결되었습니다. –

답변

2

이것은 HeaderListView의 문제점입니다. listview (listView.setId(1))의 id를 정수로 설정하면 문제가 해결됩니다.

관련 문제