findViewByID не работает в макете вкладок

я использую макет вкладок, соответствующий этому руководству:

руководство по макету вкладок 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» для нулевой ссылки на объект

Где должна быть определена кнопка и установлена ​​ли она OnClickListener?


person Majid Rostamian    schedule 05.07.2018    source источник
comment
где Кнопка? покажи свой макет(ы)   -  person letsCode    schedule 05.07.2018
comment
Вы должны найти кнопку внутри класса фрагмента и установить для нее прослушиватель onclick, который не активен.   -  person Hemanth S Tobi    schedule 05.07.2018
comment
кнопка находится в файле fragment_one.xml @DroiDev   -  person Majid Rostamian    schedule 05.07.2018


Ответы (1)


Несмотря на то, что фрагмент размещается в действии, он имеет собственный макет (который содержится в макете действия), поэтому вам придется определить представление фрагмента в его java class.

В большинстве случаев у фрагмента будет свой собственный класс Java, которым вы сможете управлять и манипулировать им, поэтому в вашем случае он должен выглядеть так:

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

После того, как вы прикрепили фрагмент к активности, вы можете использовать:

myFragment.button.setClickEnabled(false);

Однако доступ к дочерним элементам фрагмента за пределами фрагмента не рекомендуется, и вы должны избегать этого, если можете.

person Tal Barda    schedule 05.07.2018
comment
Как лучше всего получить доступ к кнопке в других классах? - person Majid Rostamian; 05.07.2018