0

Я получаю эту ошибку java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.support.v4.app.Fragment, когда пытаюсь открыть свою деятельность CuteCollection.java в своем приложении. Странная часть заключается в том, что когда я нажимаю на первую строку (FragmentPagerAdapter.java:122) в ошибке logcat, она показывает мне строку из файла в библиотеке v4.support. Я не могу редактировать этот код, поэтому в моем коде должно быть что-то, что я могу изменить.java.lang.ClassCastException: android.widget.LinearLayout не может быть добавлен в android.support.v4.app.Fragment

Чтобы перейти к этой операции, нажмите кнопку в моем HomeFragment.java фрагменте, который является фрагментом в моем навигационном ящике, который также имеет расширение android.support.v4.app.Fragment, как и все элементы в моем навигационном ящике.

Я думаю, что это может быть связано с моим FragmentPagerAdpater. Хотя я все изменил все свои android.app.Fragment до android.support.v4.app.Fragment, но по-прежнему та же ошибка.

UPDATE: Когда я нажимаю на первой линии в support.v4 библиотеке, которая называется FragmentPagerAdapter, она воспитывает этот класс и показывает Fragment fragment = (Fragment)object; подсвечивается, которая является частью этого метода (хотя я не могу изменить это, так как это от Android):

@Override 
    public void setPrimaryItem(ViewGroup container, int position, Object object) { 
     Fragment fragment = (Fragment)object; 
     if (fragment != mCurrentPrimaryItem) { 
      if (mCurrentPrimaryItem != null) { 
       mCurrentPrimaryItem.setMenuVisibility(false); 
       mCurrentPrimaryItem.setUserVisibleHint(false); 
      } 
      if (fragment != null) { 
       fragment.setMenuVisibility(true); 
       fragment.setUserVisibleHint(true); 
      } 
      mCurrentPrimaryItem = fragment; 
     } 
    } 

Любые советы или рекомендации? Благодарю.

CuteCollectionFragment.java

package org.azurespot.cutecollection; 

import android.os.Bundle; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.ActionBarActivity; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

import com.astuetz.PagerSlidingTabStrip; 

import org.azurespot.R; 

/** 
* Created by mizu on 1/26/15. 
*/ 
public class CuteCollection extends ActionBarActivity { 

    private static final int PHOTO_TAB = 0; 
    private static final int VIDEO_TAB = 1; 
    private static final int AUDIO_TAB = 2; 
    private static final int TEXT_TAB = 3; 

    PhotoTab photoTab; 
    TextTab textTab; 
    VideoTab videoTab; 
    AudioTab audioTab; 


    public CuteCollection(){} 

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

     // Instantiate tabs 
     photoTab = new PhotoTab(); 
     textTab = new TextTab(); 
     videoTab = new VideoTab(); 
     audioTab = new AudioTab(); 

     // Initialize the ViewPager and set an adapter 
     ViewPager pager = (ViewPager) findViewById(R.id.viewpager); 
     pager.setAdapter(new TabsAdapter(getSupportFragmentManager())); 

     // Bind the tabs to the ViewPager 
     PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) 
              findViewById(R.id.tabs); 
     tabs.setViewPager(pager); 

    } 

    private class TabsAdapter extends FragmentPagerAdapter { 

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

     /** 
     * @return the number of pages (tabs) to display 
     */ 
     @Override 
     public int getCount() { 
      return 4; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      switch (position) { 
       case 0: 
        return "Photos"; 
       case 1: 
        return "Videos"; 
       case 2: 
        return "Sounds"; 
       case 3: 
        return "Poems"; 
      } 

      return null; 
     } 

     /** 
     * @return true if the value returned from 
     *   {@link #instantiateItem(ViewGroup, int)} is the same object 
     *   as the {@link View} added to the {@link ViewPager}. 
     */ 
     @Override 
     public boolean isViewFromObject(View view, Object o) { 
      return o == view; 
     } 

     @Override 
     public android.support.v4.app.Fragment getItem(int position) { 

      switch(position){ 
       case PHOTO_TAB: 
        Bundle photoBundle = new Bundle(); 
        photoBundle.putInt("page_position", position + 1); 
        PhotoTab pt = new PhotoTab(); 
        pt.setArguments(photoBundle); 
        return pt; 
       case VIDEO_TAB : 
        Bundle videoBundle = new Bundle(); 
        videoBundle.putInt("page_position", position + 1); 
        VideoTab vt = new VideoTab(); 
        vt.setArguments(videoBundle); 
        return new VideoTab(); 
       case AUDIO_TAB: 
        Bundle audioBundle = new Bundle(); 
        audioBundle.putInt("page_position", position + 1); 
        AudioTab at = new AudioTab(); 
        at.setArguments(audioBundle); 
        return new AudioTab(); 
       case TEXT_TAB: 
        Bundle textBundle = new Bundle(); 
        textBundle.putInt("page_position", position + 1); 
        TextTab tt = new TextTab(); 
        tt.setArguments(textBundle); 
        return new TextTab(); 
      } 

      return null; 

     } 

     /** 
     * Instantiate the {@link View} which should be displayed at 
     * {@code position}. Here we inflate a layout from the apps resources 
     * and then change the text view to signify the position. 
     */ 
     @Override 
     public Object instantiateItem(ViewGroup container, int position) { 
      // Inflate a new layout from our resources 

      View view = getLayoutInflater().inflate(R.layout.pager_item, 
        container, false); 
      // Add the newly created View to the ViewPager 
      container.addView(view); 

      // Retrieve a TextView from the inflated View, and update it's text 
      TextView title = (TextView) view.findViewById(R.id.item_title); 
      title.setText(String.valueOf(position)); 

      // Return the View 
      return view; 
     } 

     /** 
     * Destroy the item from the {@link ViewPager}. In our case this is 
     * simply removing the {@link View}. 
     */ 
     @Override 
     public void destroyItem(ViewGroup container, int position, Object object) { 
      container.removeView((View) object); 
     } 
    } 
} 

fragment_cute_collection.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:custom="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#2198bb" > 

    <com.astuetz.PagerSlidingTabStrip 
     android:id="@+id/tabs" 
     android:layout_width="match_parent" 
     android:layout_height="?attr/actionBarSize" 
     android:background="?attr/colorPrimary" 
     custom:pstsTextColorSelected="#ffffff" 
     custom:pstsUnderlineColor="#ffffff" 
     custom:pstsIndicatorColor="#ffffff" 
     android:textColor="#2198bb"/> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="0px" 
     android:background="@android:color/white" /> 

</RelativeLayout> 

Logcat

03-07 18:35:42.669 6340-6340/org.azurespot E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: org.azurespot, PID: 6340 
java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.support.v4.app.Fragment 
     at android.support.v4.app.FragmentPagerAdapter.setPrimaryItem(FragmentPagerAdapter.java:122) 
     at android.support.v4.view.ViewPager.populate(ViewPager.java:1071) 
     at android.support.v4.view.ViewPager.populate(ViewPager.java:919) 
     at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1441) 
     at android.view.View.measure(View.java:17619) 
     at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719) 
     at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455) 
     at android.view.View.measure(View.java:17619) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5428) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.view.View.measure(View.java:17619) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5428) 
     at android.support.v7.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:453) 
     at android.view.View.measure(View.java:17619) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5428) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at android.view.View.measure(View.java:17619) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5428) 
     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1410) 
     at android.widget.LinearLayout.measureVertical(LinearLayout.java:695) 
     at android.widget.LinearLayout.onMeasure(LinearLayout.java:588) 
     at android.view.View.measure(View.java:17619) 
     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5428) 
     at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) 
     at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2588) 
     at android.view.View.measure(View.java:17619) 
     at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2317) 
     at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1412) 
     at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1613) 
     at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1270) 
     at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6691) 
     at android.view.Choreographer$CallbackRecord.run(Choreographer.java:813) 
     at android.view.Choreographer.doCallbacks(Choreographer.java:613) 
     at android.view.Choreographer.doFrame(Choreographer.java:583) 
     at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:799) 
     at android.os.Handler.handleCallback(Handler.java:733) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:146) 
     at android.app.ActivityThread.main(ActivityThread.java:5731) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1291) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1107) 
     at dalvik.system.NativeStart.main(Native Method) 
+0

Мне непонятно, каков ваш вопрос. Я думаю, вы просто хотите сначала решить свою ошибку во время выполнения. А затем справитесь с вашим дизайном. Для этого я отправлю ответ, так как это распространенная ошибка с фрагментами, я думаю. –

+0

Я обновил свой самый ранний ответ на «android.support.v4.app.Fragment» и разместил еще один для вас, чтобы выбрать рабочий образец и дизайн. –

ответ

1

Ваш текущий код, похоже, запутался, если вы не исправите ошибку Exception. В Google есть рабочий пример кода, и это очень похоже на ваш код и соответствует вашему видению. Я пробовал это, и он работы. Ссылка на SlidingTabsBasic. Одно предупреждение, что вы должны изменить ваш Gradle построить файл. Если вы выберете этот путь, то я могу отправить мой файл сборки.

Другой подобный пример на том же веб-странице SlidingTabsColors, который звучит хорошо, так как я в конечном итоге настраиваю цвета для любого графического интерфейса, который я делаю. SDK, возможно, доступны на вашем локальном диске, если вы его установили. Если вы решите этот маршрут, просто примите его как лучший ответ и отправьте сообщение какие бы проблемы вы ни придумали. По крайней мере, я знаю, что пример кода работает.

Для того, чтобы вы знали, есть интересное чтение в Creating Swipe Views with Tabs, которое также соответствует вашему видению, и код кажется более простым, чем то, что я рекомендую выше. Но ... он использует ActionBar.TabListener, который устарел для Lollipop, API версии 21. Ваш выбор ...

+1

Спасибо @TOA! Мне удалось получить представление «Создание прокрученных представлений» с вкладками, чтобы работать минимально, чтобы просто показывать вкладки. Однако они не будут показывать мои фрагменты. Я заметил в коде, что они не используют xml, они просто показывают текст, помещенный в «TextView» для каждой закладки. В моем приложении это просто «GridView» для каждой страницы, но каждый фрагмент вкладки имеет свой собственный макет, который мне нужно использовать. Еще одна проблема: мне нужно стилизовать вкладки, поэтому не уверен, как это сделать. Есть ли способ помочь мне в чате? (Когда у вас есть шанс, конечно). Я также не могу перетащить вкладки, просто нажимаю на них, чтобы изменить их. – Azurespot

+0

Я рад, что вы продвигаетесь вперед и больше не застреваете в неопределенной ошибке файла XML. Проект, упомянутый выше (я его использовал), работает хорошо. Я использовал проект для заполнения ListViews на вкладках с несколькими столбцами, и он прокручивается. –

+0

Если у вас есть дополнительные вопросы, и, похоже, просто отправьте его на Stackoverflow с тегами listview, android-fragments и Android. Вот как мы создаем сообщество и обмениваемся информацией, в отличие от беседы. Я проверю. Тем временем вы можете выбрать это, чтобы быть правильным и полезным ответом. –

0

Может быть два разных решения/части. Часть 1) В вашем публикуемую файл Java, выполните следующие действия:

import android.support.v4.app.Fragment ; 

удалить или закомментировать:

import android.app.Fragment; 

Причина заключается в использовании android.support.v4.app.Fragment , И это несовместимо с вашим текущим импортом android.app.Fragment. Кроме того, все ваши импортные ссылки android.support.v4, так что вы знаете, что вам следует сделать это в любом случае, чтобы быть последовательным :-) К сожалению, компилятор не обнаруживает эту несовместимость.

часть 2) Поскольку вы используете ActionBarActivity, может возникнуть проблема с файлом сборки или настройками. Проблема подтверждается другими в Stackoverflow @ActionBarActivity cannot resolve a symbol и Error inflating class from library. Я знаю, что ваша ошибка звучит по-другому, но я думаю, что проблема может быть одинаковой. В принципе вы можете проверить файл сборки Gradle (при условии, что вы используете его).

dependencies { 
    compile "com.android.support:support-v4:21.0.2" 
} 

Идея заключается в том, чтобы использовать компиляции «com.android поддержка : поддержка-v4 ..."

+0

Спасибо, я изменил каждое действие с 'android.app.Fragment' и изменил его на' android.support.v4.app.Fragment', но эта ошибка все еще происходит. Причина, по которой я опубликовал все детали, состоит в том, что я думаю, что это возможно связано с ними и не может найти ничего в Stack для решения моей проблемы, поэтому необходимы детали. Я просто не знаю, что может означать ошибка. – Azurespot

+0

Поскольку это ошибка во время выполнения (предполагается), можете ли вы пройти через код через отладчик и сообщить нам, какая строка кода вы терпите неудачу? Вы можете обновить свой код, чтобы уменьшить недоразумения между нами. Я проверю. –

+0

Спасибо, я очень ценю вашу помощь. Я застрял в попытке заставить этот 'PagerSlidingTabStrip' работать в течение нескольких дней. Я обновил свой код. Я кое-что изменил. Я думал, что лучше всего вывести 'CuteCollection.java' из моего навигационного ящика, чтобы он мог стать« Activity », а не« Fragment ». Мне приходилось иметь возможность использовать 'getSupportFragmentManager()', который поступает из 'FragmentActivity' (который находится внутри' ActionBarActivity'), который требуется адаптеру для подключения полосы вкладок к моему представлению. Так как вкладки - это все фрагменты. Хотелось бы узнать, что вы думаете, спасибо. – Azurespot

 Смежные вопросы

  • Нет связанных вопросов^_^