使用标签布局将数据从活动发送到片段使用Android中的可滑动视图

问题描述:

我使用此tutorial创建了带有可滑动视图的标签布局。我试图从Activity传递一个字符串到Fragment。我读了关于fragment communication和几个其他话题在*但仍然我得到空指针异常。这里是我的代码:使用标签布局将数据从活动发送到片段使用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) 

有我的问题解决方案的人? :)

+0

请评论'EnterExitFragment.java'文件的第55行。 – NitroNbg

+0

如果我评论第55行,它会工作,但我不会从'MainActiviti.java'获取字符串。 – cris135

+0

请原谅我的文盲,我的意思是在该行之后发表评论,以便我们知道哪一行是第55行:D – NitroNbg

编辑:我的建议是让下面的构造这需要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); 
    } 
+0

在夫妇更换智能手机上的每个启动应用程序后,我已经忘记了这一行,请购买它仍然没有改变错误,它仍然是第55行的空指针。 – cris135

+0

LogCat与您所拥有的完全一样贴? – NitroNbg

+0

是的,这是一样的。在创建像我这样的标签之后,有没有其他方法可以在活动和片段之间进行通信?也许替换methof的第一个参数应该不同? 'transaction.replace(R.id.pager,enterExitFragment);' – cris135

我没有看到你设置你的论点要片段。如果你这样做了,但是你忘了写请告诉我...

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(); 
+0

我在NitroNbg看到我忘记了但是不会改变错误之后添加了这一行。我写了下面提到的评论。 – cris135

+0

您可以尝试在onClick事件之前获取电子邮件,只是为了确保getArgumetns是否为null,或者onClick为null? – yahya

+0

我在onClick事件前收到邮件,错误是一样的。 – cris135