findViewByID 在选项卡布局中不起作用
findViewByID not work in tab layout
我使用与本教程相匹配的选项卡布局:
tab layout tutorial androidhive
它工作正常,但是当我向 fragment_one.xml 添加按钮时,我无法为此按钮使用 setOnClickListener 因为 findViewById 在 MainActivity.java
中不起作用
MainActivity 的代码如下:
public class MainActivity extends AppCompatActivity {
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action",Snackbar.LENGTH_LONG).setAction("Action", null).show();
}
});
}
应用因以下错误而停止:
java.lang.NullPointerException: 尝试在空对象引用
上调用虚拟方法'void android.widget.Button.setOnClickListener'
按钮应该在哪里定义和setOnClickListener?
public class MainActivity extends AppCompatActivity {
Button button;
Fragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragment = new Fragment();
View view = fragment.getView();
if (view !=null) {
view.findViewById(R.id.button);
}
}
}
即使片段由 activity 托管,它也有自己的布局(包含 在 activity 的布局中)并且因此,您必须在 java class
.
中定义片段的视图
在大多数情况下,片段会有自己的 Java class 供您管理和操作,因此在您的情况下,它应该如下所示:
public class OneFragment extends Fragment{
public OneFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_one, container, false);
Button button=view.findViewById(R.id.myButtonInFragment);
return view;
}
}
如果您想从其父按钮 activity 访问此按钮,您可以通过使按钮 public:
public class OneFragment extends Fragment{
public Button button;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_one, container, false);
button=view.findViewById(R.id.myButtonInFragment);
return view;
}
}
然后,使用您 activity
中的片段实例访问它:
OneFragment myFragment=new OneFragment();
将片段附加到 activity 后,您可以使用:
myFragment.button.setClickEnabled(false);
但是,不建议在片段之外访问片段的子片段,如果可以的话应该避免。
我使用与本教程相匹配的选项卡布局:
tab layout tutorial androidhive
它工作正常,但是当我向 fragment_one.xml 添加按钮时,我无法为此按钮使用 setOnClickListener 因为 findViewById 在 MainActivity.java
中不起作用MainActivity 的代码如下:
public class MainActivity extends AppCompatActivity {
Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
setupViewPager(viewPager);
TabLayout tabLayout = (TabLayout) findViewById(R.id.tabs);
tabLayout.setupWithViewPager(viewPager);
button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "Replace with your own action",Snackbar.LENGTH_LONG).setAction("Action", null).show();
}
});
}
应用因以下错误而停止: java.lang.NullPointerException: 尝试在空对象引用
上调用虚拟方法'void android.widget.Button.setOnClickListener'按钮应该在哪里定义和setOnClickListener?
public class MainActivity extends AppCompatActivity {
Button button;
Fragment fragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
fragment = new Fragment();
View view = fragment.getView();
if (view !=null) {
view.findViewById(R.id.button);
}
}
}
即使片段由 activity 托管,它也有自己的布局(包含 在 activity 的布局中)并且因此,您必须在 java class
.
在大多数情况下,片段会有自己的 Java class 供您管理和操作,因此在您的情况下,它应该如下所示:
public class OneFragment extends Fragment{
public OneFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_one, container, false);
Button button=view.findViewById(R.id.myButtonInFragment);
return view;
}
}
如果您想从其父按钮 activity 访问此按钮,您可以通过使按钮 public:
public class OneFragment extends Fragment{
public Button button;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view=inflater.inflate(R.layout.fragment_one, container, false);
button=view.findViewById(R.id.myButtonInFragment);
return view;
}
}
然后,使用您 activity
中的片段实例访问它:
OneFragment myFragment=new OneFragment();
将片段附加到 activity 后,您可以使用:
myFragment.button.setClickEnabled(false);
但是,不建议在片段之外访问片段的子片段,如果可以的话应该避免。