简体   繁体   English

Android活动-从一个屏幕切换到另一个屏幕

[英]Android Activity – From one screen to another screen

Iam new to Android development, I have created an android sliding menu using Navigation Drawer by following this tutorial: http://www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/ 我是Android开发的新手,我按照以下教程使用导航抽屉创建了一个android滑动菜单: http : //www.androidhive.info/2013/11/android-sliding-menu-using-navigation-drawer/

I have placed a button in the main page (HomeFragment) of the app, I would like to link the button to another activity/page (NewActivity). 我在应用程序的主页(HomeFragment)中放置了一个按钮,我想将该按钮链接到另一个活动/页面(NewActivity)。 Currently I am getting a lot of errors. 目前,我遇到很多错误。

MainActivity: 主要活动:

package info.androidhive.slidingmenu;

import info.androidhive.slidingmenu.adapter.NavDrawerListAdapter;
import info.androidhive.slidingmenu.model.NavDrawerItem;

import java.util.ArrayList;

import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
import android.content.res.Configuration;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

public class MainActivity extends Activity {
    private DrawerLayout mDrawerLayout;
    private ListView mDrawerList;
    private ActionBarDrawerToggle mDrawerToggle;

    // nav drawer title
    private CharSequence mDrawerTitle;

    // used to store app title
    private CharSequence mTitle;

    // slide menu items
    private String[] navMenuTitles;
    private TypedArray navMenuIcons;

    private ArrayList<NavDrawerItem> navDrawerItems;
    private NavDrawerListAdapter adapter;

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

        mTitle = mDrawerTitle = getTitle();

        // load slide menu items
        navMenuTitles = getResources().getStringArray(R.array.nav_drawer_items);

        // nav drawer icons from resources
        navMenuIcons = getResources()
                .obtainTypedArray(R.array.nav_drawer_icons);

        mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
        mDrawerList = (ListView) findViewById(R.id.list_slidermenu);

        navDrawerItems = new ArrayList<NavDrawerItem>();

        // adding nav drawer items to array
        // Home
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[0], navMenuIcons.getResourceId(0, -1)));
        // Find People
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[1], navMenuIcons.getResourceId(1, -1)));
        // Photos
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[2], navMenuIcons.getResourceId(2, -1)));
        // Communities, Will add a counter here
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[3], navMenuIcons.getResourceId(3, -1), true, "22"));
        // Pages
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[4], navMenuIcons.getResourceId(4, -1)));
        // What's hot, We  will add a counter here
        navDrawerItems.add(new NavDrawerItem(navMenuTitles[5], navMenuIcons.getResourceId(5, -1), true, "50+"));


        // Recycle the typed array
        navMenuIcons.recycle();

        mDrawerList.setOnItemClickListener(new SlideMenuClickListener());

        // setting the nav drawer list adapter
        adapter = new NavDrawerListAdapter(getApplicationContext(),
                navDrawerItems);
        mDrawerList.setAdapter(adapter);

        // enabling action bar app icon and behaving it as toggle button
        getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);

        mDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout,
                R.drawable.ic_drawer, //nav menu toggle icon
                R.string.app_name, // nav drawer open - description for accessibility
                R.string.app_name // nav drawer close - description for accessibility
        ) {
            public void onDrawerClosed(View view) {
                getActionBar().setTitle(mTitle);
                // calling onPrepareOptionsMenu() to show action bar icons
                invalidateOptionsMenu();
            }

            public void onDrawerOpened(View drawerView) {
                getActionBar().setTitle(mDrawerTitle);
                // calling onPrepareOptionsMenu() to hide action bar icons
                invalidateOptionsMenu();
            }
        };
        mDrawerLayout.setDrawerListener(mDrawerToggle);

        if (savedInstanceState == null) {
            // on first time display view for first nav item
            displayView(0);
        }
    }

    /**
     * Slide menu item click listener
     * */
    private class SlideMenuClickListener implements
            ListView.OnItemClickListener {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            // display view for selected nav drawer item
            displayView(position);
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // toggle nav drawer on selecting action bar app icon/title
        if (mDrawerToggle.onOptionsItemSelected(item)) {
            return true;
        }
        // Handle action bar actions click
        switch (item.getItemId()) {
        case R.id.action_settings:
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    /* *
     * Called when invalidateOptionsMenu() is triggered
     */
    @Override
    public boolean onPrepareOptionsMenu(Menu menu) {
        // if nav drawer is opened, hide the action items
        boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
        menu.findItem(R.id.action_settings).setVisible(!drawerOpen);
        return super.onPrepareOptionsMenu(menu);
    }

    /**
     * Diplaying fragment view for selected nav drawer list item
     * */
    private void displayView(int position) {
        // update the main content by replacing fragments
        Fragment fragment = null;
        switch (position) {
        case 0:
            fragment = new HomeFragment();
            break;
        case 1:
            fragment = new FindPeopleFragment();
            break;
        case 2:
            fragment = new PhotosFragment();
            break;
        case 3:
            fragment = new CommunityFragment();
            break;
        case 4:
            fragment = new PagesFragment();
            break;
        case 5:
            fragment = new WhatsHotFragment();
            break;

        default:
            break;
        }

        if (fragment != null) {
            FragmentManager fragmentManager = getFragmentManager();
            fragmentManager.beginTransaction()
                    .replace(R.id.frame_container, fragment).commit();

            // update selected item and title, then close the drawer
            mDrawerList.setItemChecked(position, true);
            mDrawerList.setSelection(position);
            setTitle(navMenuTitles[position]);
            mDrawerLayout.closeDrawer(mDrawerList);
        } else {
            // error in creating fragment
            Log.e("MainActivity", "Error in creating fragment");
        }
    }

    @Override
    public void setTitle(CharSequence title) {
        mTitle = title;
        getActionBar().setTitle(mTitle);
    }

    /**
     * When using the ActionBarDrawerToggle, you must call it during
     * onPostCreate() and onConfigurationChanged()...
     */

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        // Sync the toggle state after onRestoreInstanceState has occurred.
        mDrawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        // Pass any configuration change to the drawer toggls
        mDrawerToggle.onConfigurationChanged(newConfig);
    }

}

HomeFragment: HomeFragment:

    package info.androidhive.slidingmenu;

import android.app.Fragment;
import android.content.Intent;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;

public class HomeFragment extends Fragment implements OnClickListener{
    private Button button;
    public HomeFragment(){}

    @Override

    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.fragment_home, container, false);

        Button b = (Button) rootView.findViewById(R.id.button1);
        b.setOnClickListener(this);

        return rootView;
    }

    public void onClick(View v) {

        switch (v.getId()) {
        case R.id.button1:

            Intent intent = new Intent(getActivity(), NewActivity.class);
            startActivity(intent);

            System.out.println("Hi its me");
            break;
        }
    }

}

NewActivity: 新活动:

  package info.androidhive.slidingmenu;

import android.os.Bundle;
import android.app.Activity;

public class NewActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Get the view from new_activity.xml
        setContentView(R.layout.new_activity);
    }
}

AndroidManifest: AndroidManifest:

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

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="17" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="info.androidhive.slidingmenu.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=".NewActivity" >
    </activity> 

    </application>

</manifest>

fragment_home.xml: fragment_home.xml:

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

    <TextView
        android:id="@+id/txtLabel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Home View"
        android:textSize="16dp" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/txtLabel"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="10dp"
        android:src="@drawable/ic_home" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/imageView1"
        android:layout_alignParentTop="true"
        android:layout_marginTop="56dp"
        android:text="Button"
        android:text="Button" />

</RelativeLayout>

logCat: logCat:

12-03 20:28:26.823: E/Trace(1373): error opening trace file: No such file or directory (2)
12-03 20:28:27.134: D/dalvikvm(1373): GC_FOR_ALLOC freed 84K, 8% free 2608K/2816K, paused 38ms, total 46ms
12-03 20:28:27.134: I/dalvikvm-heap(1373): Grow heap (frag case) to 3.269MB for 635812-byte allocation
12-03 20:28:27.184: D/dalvikvm(1373): GC_FOR_ALLOC freed 2K, 7% free 3226K/3440K, paused 49ms, total 49ms
12-03 20:28:27.276: D/dalvikvm(1373): GC_CONCURRENT freed <1K, 6% free 3261K/3440K, paused 4ms+62ms, total 89ms
12-03 20:28:27.284: D/AndroidRuntime(1373): Shutting down VM
12-03 20:28:27.284: W/dalvikvm(1373): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
12-03 20:28:27.314: E/AndroidRuntime(1373): FATAL EXCEPTION: main
12-03 20:28:27.314: E/AndroidRuntime(1373): java.lang.RuntimeException: Unable to start activity ComponentInfo{info.androidhive.slidingmenu/info.androidhive.slidingmenu.MainActivity}: java.lang.NullPointerException
12-03 20:28:27.314: E/AndroidRuntime(1373):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at android.app.ActivityThread.access$600(ActivityThread.java:141)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at android.os.Looper.loop(Looper.java:137)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at android.app.ActivityThread.main(ActivityThread.java:5041)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at java.lang.reflect.Method.invokeNative(Native Method)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at java.lang.reflect.Method.invoke(Method.java:511)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at dalvik.system.NativeStart.main(Native Method)
12-03 20:28:27.314: E/AndroidRuntime(1373): Caused by: java.lang.NullPointerException
12-03 20:28:27.314: E/AndroidRuntime(1373):     at info.androidhive.slidingmenu.HomeFragment.onCreateView(HomeFragment.java:23)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at android.app.Fragment.performCreateView(Fragment.java:1695)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1057)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at android.app.BackStackRecord.run(BackStackRecord.java:682)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1435)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at android.app.Activity.performStart(Activity.java:5113)
12-03 20:28:27.314: E/AndroidRuntime(1373):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2153)
12-03 20:28:27.314: E/AndroidRuntime(1373):     ... 11 more

UPDATED : 更新时间

Everything works fine now and the code above is updated. 现在一切正常,上面的代码已更新。 I solved the issue by using "intent" in the HomeFragment, in addition I added a new activity to the manifesto. 我通过在HomeFragment中使用“意图”解决了该问题,此外,我还在清单中添加了新的活动。

Look at the second line here: 在这里看第二行:

 12-03 20:28:27.314: E/AndroidRuntime(1373): Caused by: java.lang.NullPointerException 12-03 20:28:27.314: E/AndroidRuntime(1373): at info.androidhive.slidingmenu.HomeFragment.onCreateView(HomeFragment.java:23) 12-03 20:28:27.314: E/AndroidRuntime(1373): at android.app.Fragment.performCreateView(Fragment.java:1695) 12-03 20:28:27.314: E/AndroidRuntime(1373): at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:885) 

There's a NullPointerException in HomeFragment.java , line 23: 第23行, HomeFragment.java有一个NullPointerException

  Button b = (Button) rootView.findViewById(R.id.button1); b.setOnClickListener(this); // line 23 

The only thing that can cause this there is that b is null . 唯一可能导致此的原因是bnull Which can happen if R.layout.fragment_home doesn't contain an element with id button1 . 如果R.layout.fragment_home不包含ID为button1的元素,则可能发生这种情况。

That's what you need to fix. 这就是您需要解决的问题。

If you have other problems after this, follow the same technique: 如果在此之后还有其他问题,请遵循相同的技术:

  1. Get the stacktrace 获取堆栈跟踪
  2. Look for the first line in the stack trace that's coming from your own code 在堆栈跟踪中查找来自您自己的代码的第一行
  3. Figure out what's wrong on the line and make the necessary corrections 找出生产线上的问题并进行必要的更正

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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