如何通过适配器访问片段元素?
How to access fragment elements via adapter?
我有 LoginActivity.class,它在 onCreate()
上使用适配器
final LoginAdapter loginAdapter = new LoginAdapter(getSupportFragmentManager(), this, tabLayout.getTabCount());
viewPager.setAdapter(loginAdapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
LoginAdapter.class
public class LoginAdapter extends FragmentPagerAdapter {
private Context context;
int totalTabs;
public LoginAdapter(@NonNull FragmentManager fm,Context context, int totalTabs) {
super(fm);
this.context = context;
this.totalTabs = totalTabs;
}
@Override
public int getCount() {
return totalTabs;
}
public Fragment getItem(int position){
switch (position){
case 0:
LoginTabFragment loginTabFragment = new LoginTabFragment();
return loginTabFragment;
case 1:
RegisterTabFragment registerTabFragment = new RegisterTabFragment();
return registerTabFragment;
default:
return null;
}}}
LoginTabFragment.class
public class LoginTabFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.login_tab_fragment, container, false);
return root;
}}
LoginActivity 需要访问位于 login_tab_fragment.xml.
的字段
userNameInput = findViewById(R.id.login_username_input);
passwordInput = findViewById(R.id.login_password_input);
loginBtn = findViewById(R.id.login_email_login_btn);
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
我得到了 NPE:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
如何访问 LoginActivity 中的 LoginTabFragment 元素?谢谢。
您可以在 activity 中定义 public 方法,您可以调用
在您的 activity
中定义此方法
public void responseFromFragment(View v){
//do your things in activity
}
从片段中调用方法
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((YourActivityClassName)getActivity()).responseFromFragment(v);
}
不推荐你走这条路
您可以在 Fragment 中执行所有操作,而无需将 ref 传递给 activity 请了解有关 fragment
的更多信息
我有 LoginActivity.class,它在 onCreate()
上使用适配器final LoginAdapter loginAdapter = new LoginAdapter(getSupportFragmentManager(), this, tabLayout.getTabCount());
viewPager.setAdapter(loginAdapter);
viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
LoginAdapter.class
public class LoginAdapter extends FragmentPagerAdapter {
private Context context;
int totalTabs;
public LoginAdapter(@NonNull FragmentManager fm,Context context, int totalTabs) {
super(fm);
this.context = context;
this.totalTabs = totalTabs;
}
@Override
public int getCount() {
return totalTabs;
}
public Fragment getItem(int position){
switch (position){
case 0:
LoginTabFragment loginTabFragment = new LoginTabFragment();
return loginTabFragment;
case 1:
RegisterTabFragment registerTabFragment = new RegisterTabFragment();
return registerTabFragment;
default:
return null;
}}}
LoginTabFragment.class
public class LoginTabFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
ViewGroup root = (ViewGroup) inflater.inflate(R.layout.login_tab_fragment, container, false);
return root;
}}
LoginActivity 需要访问位于 login_tab_fragment.xml.
的字段userNameInput = findViewById(R.id.login_username_input);
passwordInput = findViewById(R.id.login_password_input);
loginBtn = findViewById(R.id.login_email_login_btn);
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
我得到了 NPE:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
如何访问 LoginActivity 中的 LoginTabFragment 元素?谢谢。
您可以在 activity 中定义 public 方法,您可以调用
在您的 activity
中定义此方法public void responseFromFragment(View v){ //do your things in activity }
从片段中调用方法
loginBtn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ((YourActivityClassName)getActivity()).responseFromFragment(v); }
不推荐你走这条路 您可以在 Fragment 中执行所有操作,而无需将 ref 传递给 activity 请了解有关 fragment
的更多信息