使用标签布局将数据从活动发送到片段使用Android中的可滑动视图
问题描述:
我使用此tutorial创建了带有可滑动视图的标签布局。我试图从Activity传递一个字符串到Fragment。我读了关于fragment communication和几个其他话题在stackoverflow但仍然我得到空指针异常。这里是我的代码:使用标签布局将数据从活动发送到片段使用Android中的可滑动视图
MainActivity.java
public class MainActivity extends FragmentActivity {
private static final int REQUEST_CODE_EMAIL = 1;
String password, email;
ViewPager viewPager;
TabsPagerAdapter tabsPagerAdapter;
ActionBar actionBar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tabsPagerAdapter = new TabsPagerAdapter(getSupportFragmentManager());
viewPager = (ViewPager) findViewById(R.id.pager);
viewPager.setOnPageChangeListener(
new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar = getActionBar();
actionBar.setSelectedNavigationItem(position);
}
});
viewPager.setAdapter(tabsPagerAdapter);
actionBar = getActionBar();
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) {
viewPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(android.app.ActionBar.Tab tab,
FragmentTransaction ft) {
// TODO Auto-generated method stub
}
};
actionBar.addTab(actionBar.newTab().setText("Głowna").setTag("main").setTabListener(tabListener));
actionBar.addTab(actionBar.newTab().setText("Rachunki").setTag("bills").setTabListener(tabListener));
Bundle bundle=new Bundle();
bundle.putString("email", "emasiofnasdbjk");
EnterExitFragment enterExitFragment = new EnterExitFragment();
android.support.v4.app.FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.pager, enterExitFragment);
transaction.addToBackStack(null);
transaction.commit();
}
activity_main.xml中
<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">
</android.support.v4.view.ViewPager>
TabsPagerAdapter.java
public class TabsPagerAdapter extends FragmentStatePagerAdapter {
public TabsPagerAdapter(FragmentManager fragmentManager){
super(fragmentManager);
}
@Override
public Fragment getItem(int i) {
switch (i){
case 0:
return new EnterExitFragment();
case 1:
return new BillsFragment();
}
return null;
}
@Override
public int getCount() {
return 2;
}
}
EnterExitFragment.java
public class EnterExitFragment extends Fragment{
TextView tvFloor1, tvFloor2, tvEmail;
Button btnSend;
Integer floorId, segmentId, spaceId, ticketId;
String floorName, segmentName, spaceName;
String email;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.activity_enter_exit, container, false);
tvEmail = ((TextView)rootView.findViewById(R.id.textEmail));
tvFloor1 = ((TextView)rootView.findViewById(R.id.textFloor1));
tvFloor2 = ((TextView)rootView.findViewById(R.id.textFloor2));
new FloorFreeSpaces(EnterExitFragment.this).execute();
btnSend = ((Button)rootView.findViewById(R.id.btnSend));
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Floor(EnterExitFragment.this).execute();
email = getArguments().getString("email"); //line 55
tvEmail.setText(email);
}
});
return rootView;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
activity_enter_exit.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:id="@+id/textFloor1"
android:layout_gravity="center_horizontal" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:id="@+id/textFloor2"
android:layout_gravity="center_horizontal" />
<TextView
android:layout_width="354dp"
android:layout_height="93dp"
android:text="Email:"
android:id="@+id/textEmail"
android:layout_gravity="center_horizontal|bottom" />
<Button
android:layout_width="120dp"
android:layout_height="wrap_content"
android:text="SEND"
android:id="@+id/btnSend"
android:layout_gravity="center_horizontal|bottom" />
</LinearLayout>
错误日志
java.lang.NullPointerException
at com.carpark.EnterExitFragment$1.onClick(EnterExitFragment.java:55)
at android.view.View.performClick(View.java:4240)
at android.view.View$PerformClick.run(View.java:17722)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5303)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:555)
at dalvik.system.NativeStart.main(Native Method)
有我的问题解决方案的人? :)
答
编辑:我的建议是让下面的构造这需要Bundle
对象作为参数:
public EnterExitFragment(Bundle bundle) {
super();
setArguments(bundle);
}
,并呼吁与bundle
对象的构造函数作为参数,而不是在你的程序中的默认值。这样你就可以在将它附加到你的Activity之前添加这个包。
此外,如果不工作,一个Bundle
属性添加到您的EEF类,构造函数初始化中,并引用它,而不是方法:
public class EnterExitFragment extends Fragment{
TextView tvFloor1, tvFloor2, tvEmail;
Button btnSend;
Integer floorId, segmentId, spaceId, ticketId;
String floorName, segmentName, spaceName;
String email;
Bundle args;
public EnterExitFragment(Bundle bundle) {
super();
args = bundle;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.activity_enter_exit, container, false);
tvEmail = ((TextView)rootView.findViewById(R.id.textEmail));
tvFloor1 = ((TextView)rootView.findViewById(R.id.textFloor1));
tvFloor2 = ((TextView)rootView.findViewById(R.id.textFloor2));
new FloorFreeSpaces(EnterExitFragment.this).execute();
btnSend = ((Button)rootView.findViewById(R.id.btnSend));
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
new Floor(EnterExitFragment.this).execute();
email = args.getString("email"); //line 55
tvEmail.setText(email);
}
});
return rootView;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
答
我没有看到你设置你的论点要片段。如果你这样做了,但是你忘了写请告诉我...
Bundle bundle=new Bundle();
bundle.putString("email", "emasiofnasdbjk");
EnterExitFragment enterExitFragment = new EnterExitFragment();
enterExitFragment.setArguments(bundle); // This line is needed...
android.support.v4.app.FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.pager, enterExitFragment);
transaction.addToBackStack(null);
transaction.commit();
请评论'EnterExitFragment.java'文件的第55行。 – NitroNbg
如果我评论第55行,它会工作,但我不会从'MainActiviti.java'获取字符串。 – cris135
请原谅我的文盲,我的意思是在该行之后发表评论,以便我们知道哪一行是第55行:D – NitroNbg