Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用选项卡式活动中的bundle将值从活动传递到片段_Java_Android_Bundle - Fatal编程技术网

Java 使用选项卡式活动中的bundle将值从活动传递到片段

Java 使用选项卡式活动中的bundle将值从活动传递到片段,java,android,bundle,Java,Android,Bundle,我是一名java文盲,仍在努力开发一款适合我个人使用的应用程序。 我从android studio的“选项卡式活动”开始,除了MainActivity中的一个片段和一个捆绑包外,其他大部分都没有改变 这是我的密码: main活动 public class MainActivity extends AppCompatActivity { private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 34; private

我是一名java文盲,仍在努力开发一款适合我个人使用的应用程序。 我从android studio的“选项卡式活动”开始,除了MainActivity中的一个片段和一个捆绑包外,其他大部分都没有改变

这是我的密码:

main活动

public class MainActivity extends AppCompatActivity {

    private static final int REQUEST_PERMISSIONS_REQUEST_CODE = 34;
    private static final String TAG = MainActivity.class.getSimpleName();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        //FloatingActionButton fab = findViewById(R.id.fab);
        Bundle bundle = new Bundle();
        bundle.putDouble("loclat", 25.4358);
        bundle.putDouble("loclang",81.8463);
        Fragment SunFragment = new SunFragment();
        SunFragment.setArguments(bundle);

        setContentView(R.layout.activity_main);
        SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager());
        ViewPager viewPager = findViewById(R.id.view_pager);
        viewPager.setAdapter(sectionsPagerAdapter);
        TabLayout tabs = findViewById(R.id.tabs);
        tabs.setupWithViewPager(viewPager);
    }
}
SectionsPagerAdapter

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    @StringRes
    private static final int[] TAB_TITLES = new int[]{R.string.tab_text_1, R.string.tab_text_2, R.string.tab_text_3};
    private final Context mContext;

    public SectionsPagerAdapter(Context context, FragmentManager fm) {
        super(fm);
        mContext = context;
    }

    @Override
    public Fragment getItem(int position) {
        // getItem is called to instantiate the fragment for the given page.
        // Return a PlaceholderFragment (defined as a static inner class below).
        //return PlaceholderFragment.newInstance(position + 1);
        switch (position) {
            case 0:
                return new SunFragment();
            //return PlaceholderFragment.newInstance(pos + 5);
            case 1:
                return PlaceholderFragment.newInstance(1);
            //return SecondFragment.newInstance();
            //return PlaceholderFragment.newInstance(pos + 1);
            default:
                return PlaceholderFragment.newInstance(2);
        }
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mContext.getResources().getString(TAB_TITLES[position]);
    }

    @Override
    public int getCount() {
        // Show 2 total pages.
        return 3;
    }
}
最后是SunFragment,我希望从MainActivity获得捆绑数据:

public class SunFragment extends Fragment {

    List<SunSession> sunsList;
    Typeface sunfont;
    Double Dlat;
    Double Dlang;

    //to be called by the MainActivity
    public SunFragment() {
        // Required empty public constructor
    }


    private static final String KEY_LOCATION_NAME = "location_name";
    public String TAG ="SunFragment";
    public String location;//="No location name found";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Retrieve location and camera position from saved instance state.
        if (savedInstanceState != null) {
            location = savedInstanceState.getCharSequence(KEY_LOCATION_NAME).toString();
            System.out.println("OnCreate location  "+location);
           // Dlat = getArguments().getDouble("loclat");
            //Dlang = getArguments().getDouble("loclang");
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View rootView = inflater.inflate(R.layout.fragment_sun, container, false);
        //onSaveInstanceState(new Bundle());
        if (getArguments() != null) {
            Dlat = getArguments().getDouble("loclat");
            Dlang = getArguments().getDouble("loclang");
        } else {
            Dlat=23.1;
            Dlang=79.9864;
        }

        Log.e("Lat", Double.toString(Dlat));
公共类SunFragment扩展片段{
列表列表;
字体;
双Dlat;
双德朗;
//由主活动调用
公共部门{
//必需的空公共构造函数
}
私有静态最终字符串KEY\u LOCATION\u NAME=“LOCATION\u NAME”;
公共字符串TAG=“SunFragment”;
公共字符串位置;//=“未找到位置名称”;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//从保存的实例状态检索位置和相机位置。
如果(savedInstanceState!=null){
location=savedInstanceState.getCharSequence(KEY_location_NAME).toString();
System.out.println(“OnCreate位置”+位置);
//Dlat=getArguments().getDouble(“loclat”);
//Dlang=getArguments().getDouble(“loclang”);
}
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
//为该碎片膨胀布局
视图根视图=充气机。充气(R.layout.fragment\u sun,容器,false);
//onSaveInstanceState(新Bundle());
如果(getArguments()!=null){
Dlat=getArguments().getDouble(“loclat”);
Dlang=getArguments().getDouble(“loclang”);
}否则{
Dlat=23.1;
Dlang=79.9864;
}
Log.e(“Lat”,Double.toString(Dlat));
我一直在关注博客,但没有传递任何价值。请帮忙


注意:这是一个更详细的问题,据我所知,需要显示更多代码。

在您的
main活动中,您的
sunFragment
未使用。请删除此部分:

/*Bundle bundle = new Bundle();
bundle.putDouble("loclat", 25.4358);
bundle.putDouble("loclang",81.8463);
Fragment SunFragment = new SunFragment();
SunFragment.setArguments(bundle);*/
您必须在
SectionsPagerAdapter
内将
bundle
设置为
fragment

case 0:
    Bundle bundle = new Bundle();
    bundle.putDouble("loclat", 25.4358);
    bundle.putDouble("loclang",81.8463);

    Fragment sunFragment = new SunFragment();
    sunFragment.setArguments(bundle);

    return sunFragment;

但是如果需要将
bundle
MainActivity
设置为
fragment
。然后使用
回调

这样可以将数据从MainActivity传递到fragment

MainActivity onCreate方法

     adapter = new Adapter(getChildFragmentManager());

     SquadsTeamListFragment  teamA =                
        SquadsTeamListFragment.newInstance(teamAData,teamBData
        adapter.addFragment(teamA, teamAName);
        viewPager.setAdapter(adapter);
        tabLayout.setupWithViewPager(viewPager);
在主要活动中使用此适配器

 static class Adapter extends FragmentStatePagerAdapter {
    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();

    Adapter(FragmentManager manager) {
        super(manager);
    }
    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }
    @Override
    public int getCount() {
        return mFragmentList.size();
    }
    void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }
    @Override
    public CharSequence getPageTitle(int position){
        return mFragmentTitleList.get(position);
     }
  }

正如您在上一个问题中所写的,您是否仍然收到错误?
Fragment-SunFragment=new-SunFragment();
以及您将此片段实例传递到
SectionsPagerAdapter
的位置?当getArguments()失败时,错误不在那里,因为我在片段本身中传递了一个值Dlat和Dlang。问题是getArguments()总是null@grabarz121:我没有理解你。我应该如何传递实例?我链接的源代码没有显示任何内容。请解释它为空,因为
SunFragment
内部
SectionsPagerAdapter
的实例与你在
MainActivity
中创建的实例不同。谢谢。这正在工作。只有一个问题:这是std是这样做的还是只是一种变通方法?实际上这取决于您的需求。在您当前的需求中,这是可以的。但在某些情况下,需要以不同的方式进行设置。
   public static SquadsTeamListFragment newInstance(String playerList, String   
  oppPlayerList) {
    SquadsTeamListFragment fragment = new SquadsTeamListFragment();
    Bundle args = new Bundle();
    args.putString(ARG_TEAM_DATA, playerList);
    args.putString(ARG_OPP_TEAM_DATA, oppPlayerList);

    fragment.setArguments(args);
    return fragment;
}
   @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if (getArguments() != null) {
        playerList = getArguments().getString(ARG_TEAM_DATA);
        oppPlayerList = getArguments().getString(ARG_OPP_TEAM_DATA);

    }
}