Im trying to create a swipe tab layout and I have imported the code for a two level list view into the application. After a week of trying to get the application to work when it builds it just builds the two level list view without the swipe tab layout at the top. I've only been doing this for about a month so i dont really understand the logcat output so i cannot find where the problem lies. if anyone can help me out this it would be much appreciated. My code is probably riddled with problems so i've posted all of my files on here.
LogCat
03-09 12:32:40.801: I/Process(1026): Sending signal. PID: 1026 SIG: 9
03-09 12:34:23.966: D/dalvikvm(1081): GC_FOR_ALLOC freed 77K, 8% free 2559K/2756K, paused 28ms, total 32ms
03-09 12:34:23.966: I/dalvikvm-heap(1081): Grow heap (frag case) to 3.220MB for 635812-byte allocation
03-09 12:34:24.006: D/dalvikvm(1081): GC_FOR_ALLOC freed 2K, 6% free 3177K/3380K, paused 39ms, total 39ms
03-09 12:34:24.066: D/dalvikvm(1081): GC_CONCURRENT freed 9K, 6% free 3198K/3380K, paused 7ms+14ms, total 53ms
03-09 12:34:24.176: D/AndroidRuntime(1081): Shutting down VM
03-09 12:34:24.176: W/dalvikvm(1081): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
03-09 12:34:24.196: E/AndroidRuntime(1081): FATAL EXCEPTION: main
03-09 12:34:24.196: E/AndroidRuntime(1081): java.lang.ClassCastException: com.learn2crack.tab.MainActivity@40ce7420 must implement OnHeadlineSelectedListener
03-09 12:34:24.196: E/AndroidRuntime(1081): at com.learn2crack.tab.HeadlinesFragment.onAttach(HeadlinesFragment.java:68)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:883)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.support.v4.app.FragmentManagerImpl.performPendingDeferredStart(FragmentManager.java:823)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.support.v4.app.Fragment.setUserVisibleHint(Fragment.java:841)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.support.v4.app.FragmentStatePagerAdapter.setPrimaryItem(FragmentStatePagerAdapter.java:152)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.support.v4.view.ViewPager.populate(ViewPager.java:1066)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.support.v4.view.ViewPager.populate(ViewPager.java:914)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1436)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.view.View.measure(View.java:15518)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.view.View.measure(View.java:15518)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.view.View.measure(View.java:15518)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
03-09 12:34:24.196: E/AndroidRuntime(1081): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2176)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.view.View.measure(View.java:15518)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.view.Choreographer.doCallbacks(Choreographer.java:562)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.view.Choreographer.doFrame(Choreographer.java:532)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.os.Handler.handleCallback(Handler.java:725)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.os.Handler.dispatchMessage(Handler.java:92)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.os.Looper.loop(Looper.java:137)
03-09 12:34:24.196: E/AndroidRuntime(1081): at android.app.ActivityThread.main(ActivityThread.java:5041)
03-09 12:34:24.196: E/AndroidRuntime(1081): at java.lang.reflect.Method.invokeNative(Native Method)
03-09 12:34:24.196: E/AndroidRuntime(1081): at java.lang.reflect.Method.invoke(Method.java:511)
03-09 12:34:24.196: E/AndroidRuntime(1081): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-09 12:34:24.196: E/AndroidRuntime(1081): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-09 12:34:24.196: E/AndroidRuntime(1081): at dalvik.system.NativeStart.main(Native Method)
ArticleFragment.java
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.learn2crack.tab;
import android.support.v4.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
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.article_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.article);
article.setText(Ipsum.Articles[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);
}
}
HeadlinesFragment.java
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.learn2crack.tab;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class HeadlinesFragment extends ListFragment {
OnHeadlineSelectedListener mCallback;
// The container Activity must implement this interface so the frag can deliver messages
public interface OnHeadlineSelectedListener {
/** Called by HeadlinesFragment when a list item is selected */
public void onArticleSelected(int position);
}
@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, Ipsum.Headlines));
}
@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.article_fragment) != 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);
}
}
MainActivity.java
package com.learn2crack.tab;
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 {
ViewPager Tab;
TabPagerAdapter TabAdapter;
ActionBar actionBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TabAdapter = new TabPagerAdapter(getSupportFragmentManager());
Tab = (ViewPager)findViewById(R.id.pager);
Tab.setOnPageChangeListener(
new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar = getActionBar();
actionBar.setSelectedNavigationItem(position); }
});
Tab.setAdapter(TabAdapter);
actionBar = getActionBar();
//Enable Tabs on Action Bar
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
ActionBar.TabListener tabListener = new ActionBar.TabListener(){
@Override
public void onTabReselected(android.app.ActionBar.Tab tab,
FragmentTransaction ft) {
// TODO Auto-generated method stub
}
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
Tab.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(android.app.ActionBar.Tab tab,
FragmentTransaction ft) {
// TODO Auto-generated method stub
}};
//Add New Tab
actionBar.addTab(actionBar.newTab().setText("Android").setTabListener(tabListener));
actionBar.addTab(actionBar.newTab().setText("iOS").setTabListener(tabListener));
actionBar.addTab(actionBar.newTab().setText("Windows").setTabListener(tabListener));
}
}
SoftwareSearchActivity.java
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.learn2crack.tab;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
interface OnHeadlineSelectedListener {
/** Called by HeadlinesFragment when a list item is selected */
public void onArticleSelected(int position);
}
public class SoftWareSearchActivity extends FragmentActivity
implements HeadlinesFragment.OnHeadlineSelectedListener {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.news_articles);
// 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.article_fragment);
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();
}
}
}
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 HeadlinesFragment();
case 1:
//Fragment for Ios Tab
return new Windows();
case 2:
//Fragment for Windows Tab
return new Windows();
}
return null;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return 3; //No of Tabs
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/pager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
article_view.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/article"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp"
android:textSize="18sp" />
news_article.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical" >
</LinearLayout>
Layout-Large folder
new_articles.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment android:name="com.example.android.fragments.HeadlinesFragment"
android:id="@+id/headlines_fragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent" />
<fragment android:name="com.example.android.fragments.ArticleFragment"
android:id="@+id/article_fragment"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.learn2crack.tab"
android:versionCode="1"
android:versionName="1.0" >
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>
<!-- The following two permissions are not required to use
Google Maps Android API v2, but are recommended. -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.learn2crack.tab.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>
<meta-data
android:name="com.google.android.maps.v2.AIzaSyDtQiCXQAlaNJTjyxy-gHqSg7ROD4tm8hQ"
android:value="AIzaSyDtQiCXQAlaNJTjyxy-gHqSg7ROD4tm8hQ"/>
</application>
</manifest>