当前位置: 动力学知识库 > 问答 > 编程问答 >

java - Type mismatch cannot convert main activity to fragment

问题描述:

I'm working with a tab layout but i'm getting the error when trying to link the tabs with my activities.I'm new at this and i have probably used the wrong terminology here but i hope you understand what i mean by it?

TabPagerAdapter.Java

package com.learn2crack.tab;

import android.support.v4.app.Fragment;

import android.support.v4.app.FragmentManager;

import android.support.v4.app.FragmentStatePagerAdapter;

public class TabPagerAdapter extends FragmentStatePagerAdapter {

public TabPagerAdapter(FragmentManager fm) {

super(fm);

// TODO Auto-generated constructor stub

}

@Override

public Fragment getItem(int i) {

switch (i) {

case 0:

//Fragement for Android Tab

return new MainActivity1();

case 1:

//Fragment for Ios Tab

return new Maps();

// case 2:

//Fragment for Windows Tab

//return new Scanner();

}

return null;

}

@Override

public int getCount() {

// TODO Auto-generated method stub

return 3; //No of Tabs

}

}

MainActivity1.java

package com.learn2crack.tab;

import android.app.Activity;

import android.os.Build;

import android.os.Bundle;

import android.support.v4.app.Fragment;

import android.support.v4.app.FragmentActivity;

import android.support.v4.app.FragmentTransaction;

import android.support.v4.app.ListFragment;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ArrayAdapter;

import android.widget.ListView;

import android.widget.TextView;

interface OnHeadlineSelectedListener {

/** Called by HeadlinesFragment when a list item is selected */

public void onArticleSelected(int position);

}

public class MainActivity1 extends FragmentActivity implements OnHeadlineSelectedListener {

/** Called when the activity is first created. */

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.rooms_view);

// Check whether the activity is using the layout version with

// the fragment_container FrameLayout. If so, we must add the first fragment

if (findViewById(R.id.fragment_container) != null) {

// However, if we're being restored from a previous state,

// then we don't need to do anything and should return or else

// we could end up with overlapping fragments.

if (savedInstanceState != null) {

return;

}

// Create an instance of ExampleFragment

HeadlinesFragment firstFragment = new HeadlinesFragment();

// In case this activity was started with special instructions from an Intent,

// pass the Intent's extras to the fragment as arguments

firstFragment.setArguments(getIntent().getExtras());

// Add the fragment to the 'fragment_container' FrameLayout

getSupportFragmentManager().beginTransaction()

.add(R.id.fragment_container, firstFragment).commit();

}

}

public void onArticleSelected(int position) {

// The user selected the headline of an article from the HeadlinesFragment

// Capture the article fragment from the activity layout

ArticleFragment articleFrag = (ArticleFragment)

getSupportFragmentManager().findFragmentById(R.id.Software);

if (articleFrag != null) {

// If article frag is available, we're in two-pane layout...

// Call a method in the ArticleFragment to update its content

articleFrag.updateArticleView(position);

} else {

// If the frag is not available, we're in the one-pane layout and must swap frags...

// Create fragment and give it an argument for the selected article

ArticleFragment newFragment = new ArticleFragment();

Bundle args = new Bundle();

args.putInt(ArticleFragment.ARG_POSITION, position);

newFragment.setArguments(args);

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,

// and add the transaction to the back stack so the user can navigate back

transaction.replace(R.id.fragment_container, newFragment);

transaction.addToBackStack(null);

// Commit the transaction

transaction.commit();

}

}

public class ArticleFragment extends Fragment {

final static String ARG_POSITION = "position";

int mCurrentPosition = -1;

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container,

Bundle savedInstanceState) {

// If activity recreated (such as from screen rotate), restore

// the previous article selection set by onSaveInstanceState().

// This is primarily necessary when in the two-pane layout.

if (savedInstanceState != null) {

mCurrentPosition = savedInstanceState.getInt(ARG_POSITION);

}

// Inflate the layout for this fragment

return inflater.inflate(R.layout.sofware_view, container, false);

}

@Override

public void onStart() {

super.onStart();

// During startup, check if there are arguments passed to the fragment.

// onStart is a good place to do this because the layout has already been

// applied to the fragment at this point so we can safely call the method

// below that sets the article text.

Bundle args = getArguments();

if (args != null) {

// Set article based on argument passed in

updateArticleView(args.getInt(ARG_POSITION));

} else if (mCurrentPosition != -1) {

// Set article based on saved instance state defined during onCreateView

updateArticleView(mCurrentPosition);

}

}

public void updateArticleView(int position) {

TextView article = (TextView) getActivity().findViewById(R.id.Software);

article.setText(Rooms[position]);

mCurrentPosition = position;

}

@Override

public void onSaveInstanceState(Bundle outState) {

super.onSaveInstanceState(outState);

// Save the current article selection in case we need to recreate the fragment

outState.putInt(ARG_POSITION, mCurrentPosition);

}

}

public class HeadlinesFragment extends ListFragment {

OnHeadlineSelectedListener mCallback;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// We need to use a different list item layout for devices older than Honeycomb

int layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ?

android.R.layout.simple_list_item_activated_1 : android.R.layout.simple_list_item_1;

// Create an array adapter for the list view, using the Ipsum headlines array

setListAdapter(new ArrayAdapter<String>(getActivity(), layout, Software));

}

@Override

public void onStart() {

super.onStart();

// When in two-pane layout, set the listview to highlight the selected list item

// (We do this during onStart because at the point the listview is available.)

if (getFragmentManager().findFragmentById(R.id.Software) != null) {

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);

}

}

@Override

public void onAttach(Activity activity) {

super.onAttach(activity);

// This makes sure that the container activity has implemented

// the callback interface. If not, it throws an exception.

try {

mCallback = (OnHeadlineSelectedListener) activity;

} catch (ClassCastException e) {

throw new ClassCastException(activity.toString()

+ " must implement OnHeadlineSelectedListener");

}

}

@Override

public void onListItemClick(ListView l, View v, int position, long id) {

// Notify the parent activity of selected item

mCallback.onArticleSelected(position);

// Set the item as checked to be highlighted when in two-pane layout

getListView().setItemChecked(position, true);

}

}

ArrayAdapter<String> adapter;

static String Software[] = {

"3D Studio Max 2014",

"Adobe Creative Suite 6",

"Agilent Agent",

"Android SDK",

"Audacity",

"C Map Tools",

"Cedar and Easy 68k",

"Context",

"CryEngine 3",

"Derive V5.0",

"Dreamweaver CS6",

"Eclipse",

"Face Modeller",

"Flash CS6",

"Image J",

"Linux",

"Matlab R2012A (Computing Toolbase)",

"Matlab R2012A (Maths)",

"Microsoft Project",

"Microsoft SQL Sever Lite",

"MinecraftEDU",

"MiniTab 16",

"MonoGame",

"NetBeans 7.3.1",

"Office 2013",

"Oracle Client",

"Photoshop CS6",

"Premiere CS6",

"Python 3.3.2",

"QT 5.1",

"R-Studio",

"Rational Architect",

"Steam",

"SWI Pro Log",

"Unreal UDK",

"Visio 2012",

"Visual Studio 2012",

"Win A&D 7 Desktop",

"Windows Mobile SDK",

"Weka ML",

"XNA Game Studio"};

static String Rooms []= { "MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

"MEA 27\n MEA 34\n",

};

}

Does anyone have any idea how to fix this?

网友答案:

getItem method must return a Fragment. Your MainActivity1 extends FragmentActivity (which exents of an Activity). You can't do this. every page must be a Fragment, nothing else.

@Override
public Fragment getItem(int i) {
    // this must return a Fragment!
}

In your app, you should have:

  1. Activity / FragmentActivity
  2. Your adapter
  3. AndroidTapPageFragment (extends Fragment)
  4. IOSTapPageFragment (extends Fragment)
  5. WindowsTapPageFragment (extends Fragment)

If your pages have the same layout/functionality, you can create one Fragment OSPageFragment for the Android,IOS and Windows Tabs.

网友答案:

getItem must return an Fragment not an Activity

分享给朋友:
您可能感兴趣的文章:
随机阅读: