findViewByID在选项卡布局中不起作用

时间:2018-07-05 16:10:48

标签: android fragment android-tablayout

我使用与本教程匹配的选项卡布局:

tab layout tutorial androidhive

它工作正常,但是当我将一个按钮添加到fragment_one.xml时,我不能对此按钮使用setOnClickListener,因为在MainActivity.java中findViewById不起作用

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?

2 个答案:

答案 0 :(得分:2)

即使一个片段由一个活动托管,它也有其自己的布局(在活动的布局中包含),因此,您必须在其{{1 }}。

在大多数情况下,片段将具有自己的Java类供您管理和操作,因此在您的情况下,它应如下所示:

java class

如果您想从其父活动中访问此按钮,可以通过将按钮设置为 public

来实现。
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;
    }

}

,然后使用您的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();

但是,不建议访问该片段之外的片段的子代,如果可以的话,应该避免使用它。

答案 1 :(得分:0)

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

        }
    }
}