无法在滑动视图中显示片段

Unable to display fragments in swipe view

我一直试图通过在我创建的两个片段之间切换来允许滑动视图,但是当我试图到达片段活动 class 时它总是崩溃。

这是扩展 fragmentActivity

的 class
package tl.com.hostel;


import android.support.v4.app.FragmentActivity;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBarActivity;
import android.annotation.TargetApi;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.ActionBar.TabListener;
import android.app.FragmentTransaction;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Build;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.GridLayout;
import android.widget.TextView;

public class Home extends FragmentActivity implements ActionBar.TabListener{
    private ViewPager viewPager;
    private String[] tabs = { "Hostels", "Search Hostels" };
    private ActionBar actionBar;
    TabPageAdapter tabPageAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);
        setTitle("Home");
        viewPager = (ViewPager) findViewById(R.id.pager);
        tabPageAdapter = new TabPageAdapter(getSupportFragmentManager()) ;
        viewPager.setAdapter(tabPageAdapter);
        actionBar = getActionBar(); 
        actionBar.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#1F2230")));
        actionBar.setStackedBackgroundDrawable(new ColorDrawable(Color.parseColor("#323445")));

        actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
        for (String tab_name : tabs) {
            actionBar.addTab(actionBar.newTab().setText(tab_name)
                    .setTabListener(this));
        }
        /*
        viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {

            @Override
            public void onPageSelected(int position) {
                actionBar.setSelectedNavigationItem(position);
            }

            @Override
            public void onPageScrolled(int arg0, float arg1, int arg2) {
            }

            @Override
            public void onPageScrollStateChanged(int arg0) {
            }
        });

*/
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.home, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

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

    }

    @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

    }

}

PagerAdapter

package tl.com.hostel;


import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

public class TabPageAdapter extends FragmentPagerAdapter {

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

    @Override
    public Fragment getItem(int index) {
        switch(index)
        {
        case 0:
            return new SearchHostel();
        case 1:
            return new SearchHostel();
        }

        return null;
    }

    @Override
    public int getCount() {
        return 2;
    }
}

我创建了两个片段

package tl.com.hostel;

import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.GridLayout;
import android.widget.LinearLayout;
import android.widget.TextView;

public class Hostel extends Fragment {
    LinearLayout ll ;
    Context context;  
    TextView tvtemp,farenhit;
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        ll = new LinearLayout(context);
        View rootview=inflater.inflate(R.layout.activity_hostel, container,false);
        context = getActivity();
                return rootview;

    }


}

第二个片段

package tl.com.hostel;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.support.v4.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.GridLayout;
import android.widget.LinearLayout;
import android.widget.Spinner;
import android.widget.TextView;

public class SearchHostel extends Fragment {
    private Spinner area, priceRange;
    Context context;
    LinearLayout ll ;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        context = getActivity();
        TextView TVprice = new TextView(context);
        TextView TVarea = new TextView(context);
        Button btnSubmit = new Button(context);
        List<String> list = new ArrayList<String>();
        list.add("Beijing");
        list.add("Cambridge");
        list.add("Harvard");
        list.add("Imperial");
        list.add("Kampar Putra");
        list.add("Manchester");
        list.add("Oxford");
        list.add("Stanford");
        list.add("Tsing Hua");
        list.add("Yale");
        ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(context,
                android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        area.setAdapter(dataAdapter);

        List<String> price = new ArrayList<String>();

        price.add("1-100");
        price.add("101-200");
        price.add("201-300");
        price.add("301-400");
        price.add("401-500");
        ArrayAdapter<String> dataAdapter2 = new ArrayAdapter<String>(context,
                android.R.layout.simple_spinner_item, list);
        dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        priceRange.setAdapter(dataAdapter);


        super.onCreate(savedInstanceState);
        GridLayout gl = new GridLayout(context);
        gl.setRowCount(6);
        gl.setColumnCount(2);
        ll = new LinearLayout(context);
        ll.setOrientation(LinearLayout.HORIZONTAL);
        ll.setGravity(Gravity.CENTER);
        ll.addView(gl);
        gl.addView(TVprice);
        gl.addView(priceRange);
        gl.addView(area);
        gl.addView(btnSubmit);
        return (View) ll;
    }

}

logcat

09-03 16:14:00.204: I/PGA(22310): Attempting to create new SOCKET connectionn pid = 22310, tid = 22310
09-03 16:14:00.204: I/PGA(22310): New SOCKET connection: tl.com.hostel (pid 22310, tid 22310)
09-03 16:14:00.204: W/PGA(22310): [22310] egl: eglCreateWindowSurface (0x557977a0, 0x0, 0x78691118, 0x775540e0)
09-03 16:14:00.204: W/PGA(22310): [22310] egl: eglCreateWindowSurface (0x557977a0, 0x0, 0x78691118, 0x775540e0) returned
09-03 16:14:00.204: D/OpenGLRenderer(22310): Enabling debug mode 0
09-03 16:14:00.864: I/Choreographer(22310): Skipped 38 frames!  The application may be doing too much work on its main thread.
09-03 16:14:04.904: I/PGA(22421): Attempting to create new SOCKET connectionn pid = 22421, tid = 22421
09-03 16:14:04.904: I/PGA(22421): New SOCKET connection: tl.com.hostel (pid 22421, tid 22421)
09-03 16:14:04.904: W/PGA(22421): [22421] egl: eglCreateWindowSurface (0x557977a0, 0x0, 0x78691308, 0x775540e0)
09-03 16:14:04.904: W/PGA(22421): [22421] egl: eglCreateWindowSurface (0x557977a0, 0x0, 0x78691308, 0x775540e0) returned
09-03 16:14:04.904: D/OpenGLRenderer(22421): Enabling debug mode 0
09-03 16:14:06.074: D/AndroidRuntime(22421): Shutting down VM
09-03 16:14:06.074: W/dalvikvm(22421): threadid=1: thread exiting with uncaught exception (group=0x64cd2b20)
09-03 16:14:06.074: I/Process(22421): Sending signal. PID: 22421 SIG: 9
09-03 16:14:06.074: D/AndroidRuntime(22421): procName from cmdline: tl.com.hostel
09-03 16:14:06.074: E/AndroidRuntime(22421): in writeCrashedAppName, pkgName :tl.com.hostel
09-03 16:14:06.074: D/AndroidRuntime(22421): file written successfully with content: tl.com.hostel StringBuffer : ;tl.com.hostel
09-03 16:14:06.074: E/AndroidRuntime(22421): FATAL EXCEPTION: main
09-03 16:14:06.074: E/AndroidRuntime(22421): Process: tl.com.hostel, PID: 22421
09-03 16:14:06.074: E/AndroidRuntime(22421): java.lang.RuntimeException: Unable to start activity ComponentInfo{tl.com.hostel/tl.com.hostel.Home}: java.lang.NullPointerException
09-03 16:14:06.074: E/AndroidRuntime(22421):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
09-03 16:14:06.074: E/AndroidRuntime(22421):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
09-03 16:14:06.074: E/AndroidRuntime(22421):    at android.app.ActivityThread.access0(ActivityThread.java:135)
09-03 16:14:06.074: E/AndroidRuntime(22421):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
09-03 16:14:06.074: E/AndroidRuntime(22421):    at android.os.Handler.dispatchMessage(Handler.java:102)
09-03 16:14:06.074: E/AndroidRuntime(22421):    at android.os.Looper.loop(Looper.java:136)
09-03 16:14:06.074: E/AndroidRuntime(22421):    at android.app.ActivityThread.main(ActivityThread.java:5021)
09-03 16:14:06.074: E/AndroidRuntime(22421):    at java.lang.reflect.Method.invokeNative(Native Method)
09-03 16:14:06.074: E/AndroidRuntime(22421):    at java.lang.reflect.Method.invoke(Method.java:515)
09-03 16:14:06.074: E/AndroidRuntime(22421):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827)
09-03 16:14:06.074: E/AndroidRuntime(22421):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643)
09-03 16:14:06.074: E/AndroidRuntime(22421):    at dalvik.system.NativeStart.main(Native Method)
09-03 16:14:06.074: E/AndroidRuntime(22421): Caused by: java.lang.NullPointerException
09-03 16:14:06.074: E/AndroidRuntime(22421):    at tl.com.hostel.Home.onCreate(Home.java:36)
09-03 16:14:06.074: E/AndroidRuntime(22421):    at android.app.Activity.performCreate(Activity.java:5231)
09-03 16:14:06.074: E/AndroidRuntime(22421):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1090)
09-03 16:14:06.074: E/AndroidRuntime(22421):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
09-03 16:14:06.074: E/AndroidRuntime(22421):    ... 11 more

当我隐藏代码时,FragmentActivity 至少会显示没有片段内容的 ActionBar 界面 "viewPager.setAdapter(tabPageAdapter);",但是一旦我允许它并尝试访问该页面,系统就会崩溃。 请帮忙!

对于logcat中给出的信息,viewPager.setAdapter(tabPageAdapter);产生一个NullPointerException。发生这种情况是因为两件事:

  • viewPager = (ViewPager) findViewById(R.id.pager); returns 为空然后 viewPager 为空。

  • tabPageAdapter = new TabPageAdapter(getSupportFragmentManager()); returns 为空然后 tabPageAdapter 为空。

确定这 2 个可能问题的原因,您将能够解决您的问题。

我对可能出现错误的地方的建议是:

  • R.id.pager 不在 R.layout.activity_home.
  • R.id.pager 不是 ViewPager