Android.widget.framelayout无法强制转换为android.support.v4.view.viewpager

时间:2014-04-17 16:56:50

标签: android android-fragments tabs

我的应用不断崩溃。我正在尝试创建标签swype导航设置。这是我的代码。

适配器类

package tabsswipe.adapter;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
//import fragments

import edu.wmich.lab4_jjohns1119.MainFragment;
//import edu.wmich.tabswithswipe.PostFragment;
//import edu.wmich.tabswithswipe.SuggestFragment;

 public class TabsPagerAdapter extends FragmentPagerAdapter {

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

@Override
public Fragment getItem(int index) {

    switch (index) {
    case 0:
        // Main fragment activity
       return new MainFragment();
    case 1:
        // Suggest fragment activity
        //return new SuggestFragment();
    case 2:
        // Post fragment activity
        //return new PostFragment();
    }

    return null;
}

@Override
public int getCount() {
    // get item count - equal to number of tabs
    return 3;
}

}

主要活动

package edu.wmich.lab4_jjohns1119;

import tabsswipe.adapter.TabsPagerAdapter;
import android.app.ActionBar.Tab;
import android.app.ActionBar.TabListener;
import android.app.ActionBar;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.view.ViewPager;


public class MainActivity extends FragmentActivity implements TabListener {

private ViewPager viewPager;
private TabsPagerAdapter mAdapter;
private ActionBar actionBar;

//tab titles
private String[] tabs = {"Main", "Photo", "Share"};


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

    //initialization
    viewPager = (ViewPager)findViewById(R.id.container);
    actionBar = getActionBar();
    mAdapter = new TabsPagerAdapter(getSupportFragmentManager());

    viewPager.setAdapter(mAdapter);
    actionBar.setHomeButtonEnabled(false);
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    //adding the tabs to the action bar
    for(String tab_name : tabs) {
        actionBar.addTab(actionBar.newTab().setText(tab_name)
                .setTabListener(this));
    }

    //on viewpager swiping, make the respective tab selected
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

        @Override
        public void onPageSelected(int position) {
            // TODO Auto-generated method stub
            //on changing the page, make tab selected
            actionBar.setSelectedNavigationItem(position);
        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onPageScrollStateChanged(int arg0) {
            // TODO Auto-generated method stub

        }
    });
}



@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
    // TODO Auto-generated method stub
    viewPager.setCurrentItem(tab.getPosition());
}

@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
    // TODO Auto-generated method stub

}

@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
    // TODO Auto-generated method stub

}

}

主要片段

package edu.wmich.lab4_jjohns1119;

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

public class MainFragment extends Fragment {

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle     savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_main, container,false);
    return rootView;
}
}

清单

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="edu.wmich.lab4_jjohns1119"
android:versionCode="1"
android:versionName="1.0" >

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="19" />

<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
    <activity
        android:name="edu.wmich.lab4_jjohns1119.MainActivity"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        android:name = "edu.wmich.lab4_jjohns1119.MainFragment"
        android:label = "@string/main_fragment_name">
    </activity>
</application>

目标是添加更多标签,以便我可以轻松在片段之间导航。看起来我只是有一个投射错误,但对我来说没有任何错误。有人可以帮忙吗?

编辑:这是我的主要XML

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="edu.wmich.lab4_jjohns1119.MainActivity"
tools:ignore="MergeRootFrame" />

片段XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >

3 个答案:

答案 0 :(得分:3)

你可以发布你的xml布局文件吗?还有堆栈跟踪?

如果我不得不猜测我会说仔细检查您的容器R.id.container是否在布局文件中声明为ViewPager

编辑:发表评论后

在你的java代码中你使用'viewPager =(ViewPager)findViewById(R.id.container);' 这意味着您尝试将名为'container'的元素转换为viewPager。

但是在你的xml文件中,名为container的元素是'FrameLayout'。

如果要使用ViewPage,则需要更改布局,而不是:

<FrameLayout xmlns:android="schemas.android.com/apk/res/android"; xmlns:tools="schemas.android.com/tools"; android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="edu.wmich.lab4_jjohns1119.MainActivity" tools:ignore="MergeRootFrame" /> 

你需要:

<FrameLayout xmlns:android="schemas.android.com/apk/res/android" 
    xmlns:tools="schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="edu.wmich.lab4_jjohns1119.MainActivity" 
    tools:ignore="MergeRootFrame" > 
    <android.support.v4.view.ViewPager  
        android:id="@+id/container" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        /> 
</FrameLayout>

或者,如果您确实想使用FrameLayout,则需要更改演员表。而不是:

viewPager = (ViewPager)findViewById(R.id.container);

使用

FrameLayout layout = (FrameLayout)findViewById(R.id.container);

答案 1 :(得分:1)

正如你被告知的那样,你可能犯了一个错误而没有宣称R.id.container是一个ViewPager,但是如果一切正确的话,试着做Project->clean有时IDE就会混淆并弄乱一些id,特别是如果你一直复制粘贴xml代码

答案 2 :(得分:0)

我会说你的空指针的问题在于你的切换。确保你有一个名为'MainFragment'的片段,添加break并添加default:,否则你的开关将返回null。

public Fragment getItem(int index) {
    switch (index) {
    case 0:
        // Main fragment activity
       return new MainFragment();
       break;
    case 1:
        return new MainFragment();
       break;
    case 2:
        return new MainFragment();
       break;
    default:
        return new MainFragment();
        break; 
    }
return null;