简体   繁体   中英

App not running in emulator

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>

Your MainActivity:

public class MainActivity extends FragmentActivity { //..

must implement OnHeadlineSelectedListener:

public class MainActivity extends FragmentActivity implements HeadlinesFragment.OnHeadlineSelectedListener { //..

because here in your onAttach method:

mCallback = (OnHeadlineSelectedListener) activity;

you are trying to cast it to an OnHeadlineSelectedListener


See also the link to android documentation: http://developer.android.com/training/basics/fragments/communicating.html#Implement

public static class MainActivity extends FragmentActivity
        implements HeadlinesFragment.OnHeadlineSelectedListener{

    //your other activity code here...


    public void onArticleSelected(int position) {
        // The user selected the headline of an article from the HeadlinesFragment
        // Do something here to display that article
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM