简体   繁体   English

如何将变量从活动传递到片段? 我对流行的解决方案有疑问

[英]How to pass variable from activity to fragment? I have problem with popular solutions

I have problem with passing variable to fragment from my activity.我在将变量从我的活动中传递给片段时遇到问题。 I Have written something like this:我写过这样的东西:

THIS IS PIECE OF MY ACTIVITY CLASS, OnCreate() function这是我的活动 CLASS, OnCreate() function

        Bundle bundle = new Bundle();
        bundle.putString("key", "value");
        MembersFragment membersFragment = new MembersFragment();
        membersFragment.setArguments(bundle);

THIS IS PIECE OF MY FRAGMENT CLASS这是我的片段 CLASS

 @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            uniCode = getArguments().getString("key");
            textView.setText(uniCode);
        }
    }

And when i want to run my application, TextView is not changed, like arguments are nulls.当我想运行我的应用程序时,TextView 不会改变,比如 arguments 是空值。 I have tried so many ways to solve this problem and now i have no idea what is wrong.我已经尝试了很多方法来解决这个问题,现在我不知道出了什么问题。 I think it may be problem with differences beetwen onCreate, onCreateView and onViewCreated, but i give up.我认为这可能是 onCreate、onCreateView 和 onViewCreated 之间存在差异的问题,但我放弃了。 Please help me请帮我

EDIT1:编辑1:

To comunicate beetwen activity and fragment i am using something like this:为了交流 beetwen 活动和片段,我正在使用这样的东西:

        tab_layout = findViewById(R.id.tab_layout);
        tab_general = findViewById(R.id.tab_general);
        tab_members = findViewById(R.id.tab_members);
        view_pager = findViewById(R.id.view_pager);
        PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager(),tab_layout.getTabCount());
        view_pager.setAdapter(pagerAdapter);
        tab_layout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                view_pager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

EDIT 3:编辑 3:

my activity class我的活动 class

public class SpecificTeamActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {

    DrawerLayout drawer_layout_st;
    NavigationView navigationView_st;
    Toolbar toolbar2_st;

    TabLayout tab_layout;
    TabItem tab_general;
    TabItem tab_members;
    ViewPager view_pager;
    String uniCode;


    @SuppressLint("SetTextI18n")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_specific_team);

        tab_layout = findViewById(R.id.tab_layout);
        tab_general = findViewById(R.id.tab_general);
        tab_members = findViewById(R.id.tab_members);
        view_pager = findViewById(R.id.view_pager);
        PagerAdapter pagerAdapter = new PagerAdapter(getSupportFragmentManager(),tab_layout.getTabCount());
        view_pager.setAdapter(pagerAdapter);
        tab_layout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
            @Override
            public void onTabSelected(TabLayout.Tab tab) {
                view_pager.setCurrentItem(tab.getPosition());
            }

            @Override
            public void onTabUnselected(TabLayout.Tab tab) {

            }

            @Override
            public void onTabReselected(TabLayout.Tab tab) {

            }
        });

        view_pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                TabLayout.Tab tab = tab_layout.getTabAt(position);
                tab.select();
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
        groupTitle = findViewById(R.id.groupTitle);
        uniCode = getIntent().getStringExtra("uniCode");

        groupTitle.setText("Grupa: " + uniCode);


        mDatabase = FirebaseDatabase.getInstance().getReference();
        mAuth = FirebaseAuth.getInstance();
        currentUser = mAuth.getCurrentUser();

        drawer_layout_st = findViewById(R.id.drawer_layout_st);
        navigationView_st = findViewById(R.id.nav_view_st);
        toolbar2_st = findViewById(R.id.toolbar2_st);

        navigationView_st.bringToFront();
        setSupportActionBar(toolbar2_st);
        ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(this, drawer_layout_st, toolbar2_st, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer_layout_st.addDrawerListener(actionBarDrawerToggle);
        actionBarDrawerToggle.syncState();
        navigationView_st.setNavigationItemSelectedListener(this);
        navigationView_st.setCheckedItem(R.id.teams);

        Bundle bundle = new Bundle();
        bundle.putString("key", "value");
        MembersFragment membersFragment = new MembersFragment();
        membersFragment.setArguments(bundle);
    }


    @SuppressLint("NonConstantResourceId")
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        switch (item.getItemId()) {
            case R.id.teams:
                Intent intent = new Intent(SpecificTeamActivity.this, GroupActivity.class);
                startActivity(intent);
                break;
            case R.id.receipts:
                Intent intent1 = new Intent(SpecificTeamActivity.this, ReceiptActivity.class);
                startActivity(intent1);
                break;
            case R.id.warranty:
                Intent intent2 = new Intent(SpecificTeamActivity.this, WarrantyActivity.class);
                startActivity(intent2);
                break;
            case R.id.stats:
                Intent intent3 = new Intent(SpecificTeamActivity.this, StatsActivity.class);
                startActivity(intent3);
                break;
            case R.id.purch_list:
                Intent intent4 = new Intent(SpecificTeamActivity.this, ShoppingListActivity.class);
                startActivity(intent4);
                break;
            case R.id.logout:
                break;
        }
        drawer_layout_st.closeDrawer(GravityCompat.START);
        return true;
    }

    public String getUniCode(){
        return uniCode;
    }
}

my fragment class code我的片段 class 代码

public class MembersFragment extends Fragment {

    private DatabaseReference mDatabase;
    private FirebaseUser currentUser;
    private FirebaseAuth mAuth;
    private final List<String> membersList = new ArrayList<>();
    private SpecificTeamActivity specificTeamActivity;

    TextView textView;

    ListView listView;

    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    private String uniCode;

    public MembersFragment() {
        // Required empty public constructor
    }

    public static MembersFragment newInstance(String param1, String param2) {
        MembersFragment fragment = new MembersFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        textView = getView().findViewById(R.id.text_view_test);
        textView.setText("test");
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            uniCode = getArguments().getString("key");
            textView.setText(uniCode);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
 

        return inflater.inflate(R.layout.fragment_members, container, false);

    }
}

my adapter class我的适配器 class

package com.example.ourmoney;

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;

public class PagerAdapter extends FragmentPagerAdapter {

    private int numOfTabs;
    private int selected;

    public PagerAdapter(FragmentManager fm, int numOfTabs) {
        super(fm,numOfTabs);
        this.numOfTabs = numOfTabs;
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {

        switch(position){
            case 0:
                selected = 0;
                return new GeneralFragment();
            case 1:
                selected = 1;
                return new MembersFragment();
            default:
                return null;
        }
    }

    @Override
    public int getCount() {
        return numOfTabs;
    }

    public int getSelected(){
        return selected;
    }
}
  1. In your activity, you're not actually doing anything to display the fragment you instantiated.在您的活动中,您实际上并没有做任何事情来显示您实例化的片段。 Add a fragment transaction to display your fragment.添加片段交易以显示您的片段。 Also make sure the argument bundle key names are actually aligned.还要确保参数包键名实际上是对齐的。

  2. In your fragment, you're trying to set the textView in onCreate() but you only init it in onViewCreated() .在您的片段中,您尝试在onCreate()中设置textView但您只在onViewCreated()中对其进行初始化。 That would crash with an NPE.这将与 NPE 一起崩溃。 Move the argument reading and textView setting to onViewCreated() too.将参数读数和textView设置也移动到onViewCreated()

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM