我一直试图通过在我创建的两个片段之间进行切换来允许滑动视图,但是当我尝试访问fragmentactivty类时它总是崩溃。
这是扩展fragmentActivity
的类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.access$800(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
当我隐藏代码“viewPager.setAdapter(tabPageAdapter);”时,FragmentActivity至少会显示与ActionBar的接口,而不会显示片段内容。但是一旦我允许它并尝试访问该页面,系统就会崩溃。 请帮忙!
答案 0 :(得分:0)
对于logcat中提供的信息,viewPager.setAdapter(tabPageAdapter);
生成NullPointerException
。这可能是因为两件事:
viewPager = (ViewPager) findViewById(R.id.pager);
返回null,然后viewPager
为空。
tabPageAdapter = new TabPageAdapter(getSupportFragmentManager());
返回null,然后tabPageAdapter
为空。
确定这两个可能问题的原因,您将能够解决您的问题。
我对错误位置的建议是:
R.id.pager
不在R.layout.activity_home
内。R.id.pager
不是ViewPager
。