Атрибут findViewById во фрагменте из активности xml Не работает

Как получить доступ к атрибуту в активности xml? Я хочу использовать его во фрагменте.

например: это мой активный xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:fab="http://schemas.android.com/apk/res-auto">

<androidx.constraintlayout.widget.ConstraintLayout
    fab:layout_constraintTop_toTopOf="parent"
    fab:layout_constraintLeft_toLeftOf="parent"
    fab:layout_constraintRight_toRightOf="parent"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/layTitle"
    android:layoutDirection="rtl"
    android:background="@color/colorPrimary"
    android:padding="@dimen/paddingTitle"
    android:elevation="@dimen/elevationActivityTitle"
    android:layout_alignParentTop="true">
    <ImageView
        fab:layout_constraintLeft_toLeftOf="parent"
        fab:layout_constraintTop_toTopOf="parent"
        fab:layout_constraintBottom_toBottomOf="parent"
        android:layout_width="@dimen/imgActivityTitle"
        android:layout_height="@dimen/imgActivityTitle"
        android:id="@+id/btn_back"
        android:src="@drawable/ic_back"
        android:elevation="5dp"
        android:layout_alignParentEnd="true"
        android:layout_centerVertical="true"/>
    

</androidx.constraintlayout.widget.ConstraintLayout>
<FrameLayout
    android:id="@+id/frag"
    android:layout_width="0dp"
    android:layout_height="0dp"
    fab:layout_constraintBottom_toBottomOf="parent"
    fab:layout_constraintTop_toBottomOf="@+id/layTitle"
    fab:layout_constraintLeft_toLeftOf="parent"
    fab:layout_constraintRight_toRightOf="parent"
    />
</androidx.constraintlayout.widget.ConstraintLayout>

Я хочу findViewByid ImageView в фрагменте. Когда я искал решение, я получил следующее:

TextView btn_back= (TextView) getView().findViewById(R.id.btn_back)

Но, к сожалению, у меня это не сработало.


person Pouria Hemati    schedule 11.11.2020    source источник
comment
Где вы используете эту линию? Деятельность или фрагмент?   -  person Süleyman Bilgin    schedule 11.11.2020
comment
я использую его во фрагменте   -  person Pouria Hemati    schedule 11.11.2020


Ответы (5)


Вы можете использовать интерфейс, чтобы сделать это:

Создайте имя интерфейса IBtnClick с помощью одного метода void: void onBtnClicked();

использовать интерфейс в действии следующим образом:

IBtnClick iBtnClick= (IBtnClick)getActivity();

здесь getAtivity — это наш контекст, если он не работает, используйте другой контекст области видимости.

и используйте свой метод в прослушивателе нажатия кнопки, как это

iBtnClick.onBtnClicked();

Теперь в вашем фрагменте вам нужно реализовать интерфейс и

вы можете добавить любое действие, которое вы хотите, в переопределенном методе.

person Hamed Karami    schedule 11.11.2020
comment
Я хочу использовать в деятельности - person Pouria Hemati; 12.11.2020
comment
Я знаю, вы можете использовать его в деятельности. - person Hamed Karami; 12.11.2020

Используйте либо viewModel, либо интерфейсы для общения между активностью и фрагментом. не пытайтесь отправить кнопку во фрагмент, а активируйте ее оттуда. Это предотвратит любые утечки или нулевые указатели.

person Arutha    schedule 11.11.2020

В порядке. У вас есть несколько вариантов.

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

MainActivity.java

TextView backButton;

backButton = findViewById(R.id.btn_back);

Фрагмент.java

((MainActivity) getActivity()).backButton

Вы можете получить текущую активность с помощью getActivity(), но компилятор Java не может понять, какая активность поэтому должна быть приведена к MainActivity.

Во-вторых, вы можете передать свой экземпляр активности во фрагмент. Вы можете использовать конструкторы и функцию newInstance(). Вы можете прочитать этот пост Лучшая практика создания нового фрагмента Android

На мой взгляд, я предпочитаю второй вариант, потому что вы гарантируете, что эти переменные включают класс активности. На некоторых устройствах возникают ошибки при первом варианте. Но второй вариант использует больше оперативной памяти, потому что вы передаете свои переменные другому классу.

Выбор остается за вами

person Süleyman Bilgin    schedule 11.11.2020
comment
Первый вариант не работает, я его использую, но приложение разбилось, возможно, второй способ работает, поэтому спасибо за ответ - person Pouria Hemati; 11.11.2020

Попробуйте этот код

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    view = inflater.inflate(R.layout.recharge_plane_fragment, container, false);

  
    alertdialog_Listview=view.findViewById(R.id.alertdialog_Listview);

  

    return view;
}
person Sandeep Pareek    schedule 11.11.2020

Вы можете объявить свой TextView btn_back статическим в действии.

public static TextView btn_back;
btn_back = (TextView) findViewById(R.id.btn_back);

и получить его во фрагменте

TextView btn_back = ((MainActivity)getActivity()).btn_back;
person Ann Developer    schedule 11.11.2020
comment
Создание статических представлений приводит к утечке памяти. Кроме того, какой смысл использовать фрагмент, если он работает только в одном конкретном действии? - person Elletlar; 11.11.2020