在 Android 中使用带有可滑动视图的选项卡布局将数据从 Activity 发送到 Fragment

2024-03-14

我使用它创建了一个带有可滑动视图的选项卡布局tutorial http://www.androidhive.info/2013/10/android-tab-layout-with-swipeable-views-1/。我正在尝试将字符串从 Activity 传递到 Fragment。我读到碎片通讯 http://developer.android.com/training/basics/fragments/communicating.html以及 stackoverflow 上的其他主题,但我仍然遇到空指针异常。这是我的代码:

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();
    }

活动主文件

<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);
    }

活动_进入_退出.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对象作为参数而不是程序中的默认参数。这样,您就可以确保在将捆绑包附加到您的活动之前添加该捆绑包。

另外,如果这不起作用,请添加Bundle属性到您的 EEF 类,在构造函数中初始化它并引用它而不是getArguments() method:

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);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Android 中使用带有可滑动视图的选项卡布局将数据从 Activity 发送到 Fragment 的相关文章

随机推荐