Как использовать элементы макета в классе фрагментов

Здесь я сделал панель навигации в Android, используя Fragment.
Теперь мне нужно распечатать свои данные, используя класс Fragment и его XML-файл, но я не могу получить идентификатор обычным способом.

Profile.java

        package com.example.dhruv.dez;

    import android.app.Activity;
    import android.app.Fragment;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;

    public class Profile extends Fragment {
        @Nullable

   //Below Line Gives Error
   BackgroundTask b = new BackgroundTask(this);

    TextView t1;

        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.profile, container, false);

        }

        @Override
        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
            super.onViewCreated(view, savedInstanceState);

            //Below Line Gives Error
            t1=FindViewById(R.id.username);

            getActivity().setTitle("PROFILE");


        }

    }

profile.xml

        <?xml version = "1.0" encoding = "utf-8"?>
    <RelativeLayout
        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">


    <TextView
        android:layout_width = "wrap_content"
        android:layout_centerHorizontal = "true"
        android:layout_centerVertical = "true"
        android:layout_height = "wrap_content"
        android:text = "PROFILE"
        android:id = "@+id/username"/>

    </RelativeLayout>

BackgroundTask.java

        public class BackgroundTask extends AsyncTask<String,Void,String>{

        Context ctx;

        public BackgroundTask(Context ctx)
        {
            this.ctx=ctx;
        }

        @Override
        protected String doInBackground(String... params) {
            StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);

            String work = params[0];

            if (work.equals("register")) {

                String name= params[1];
                String email = params[2];
                String mobno= params[3];
                String pass = params[4];
                try {
                    String login_url = "http://myweb.in/dhruv/signup.php";
                    URL url = new URL(login_url);
                    HttpURLConnection huc = (HttpURLConnection) url.openConnection();
                    huc.setRequestMethod("POST");
                    huc.setDoOutput(true);
                    OutputStream os = huc.getOutputStream();
                    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
                    String data = URLEncoder.encode("name", "UTF-8") + " = " + URLEncoder.encode(name, "UTF-8") + "&"

                            + URLEncoder.encode("email", "UTF-8") + " = " + URLEncoder.encode(email, "UTF-8") +"&"
                            + URLEncoder.encode("mobno", "UTF-8") + " = " + URLEncoder.encode(mobno, "UTF-8") +"&"
                            + URLEncoder.encode("pass", "UTF-8") + " = " + URLEncoder.encode(pass, "UTF-8");
                    Log.w("Error", data);
                    bw.write(data);
                    bw.flush();
                    bw.close();
                    os.close();
                    InputStream is = huc.getInputStream();
                    BufferedReader br = new BufferedReader(new InputStreamReader(is, "iso-8859-1"));
                    String respone = br.readLine();
                    Log.w("Response", respone);
                    is.close();
                    return respone;
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }

Почему я не могу использовать объект фоновой задачи в своем классе фрагмента? Могу я узнать, почему возникает эта проблема?
И безопасно ли использовать фрагмнеты в Android-проектах?
Есть ли лучшие способы сделать это?

Этот макет находится в вашем параметре представления обратного вызова жизненного цикла onViewCreated. Поэтому используйте view.findViewById (YOUR_ID). Он должен работать. Или вы также можете использовать метод getView () в обратном вызове onActivityCreated () ..

Kannan_SJD 25.06.2018 15:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
495
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Во фрагменте необходимо использовать:

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    t1 = (TextView) view.findViewById(R.id.username);
    getActivity().setTitle("PROFILE");
}

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

DHRUV THAKKAR 25.06.2018 15:19

Вы пытаетесь использовать функциональность действия, но фрагменты сильно отличаются от них. Вам нужно найти представления внутри RootView, поэтому вам нужно будет изменить строку на:

t1 = view.findViewById(R.id.username)

Также вам, вероятно, следует прочитать немного больше о фрагментах, если вы не знаете, как их использовать. Хорошей отправной точкой, вероятно, будет https://developer.android.com/guide/components/fragments

а как насчет BackgroundTask b = new BackgroundTask (this);

DHRUV THAKKAR 25.06.2018 15:24

Я не знаю, какой BackgroundTask вы используете, но если вы хотите узнать о работе в другом потоке, я бы порекомендовал вам познакомиться с AsyncTasks, Loader или Services, просто погуглите эти ключевые слова, и вы, вероятно, найдете то, что вам нужно.

glm9637 25.06.2018 15:43

Этот макет находится в вашем параметре представления обратного вызова жизненного цикла onViewCreated. Поэтому используйте view.findViewById(YOUR_ID). Он должен работать. Или вы также можете использовать метод getView() в обратном вызове onActivityCreated () ..

Can I know why is there problem. And Is using fragmnets in android projects safe? Are there any better ways to do this?

Определенно да. На самом деле рекомендуется использовать фрагменты, когда у вас есть более управляемый пользовательский интерфейс, который постоянно меняется, а обратные вызовы жизненного цикла хорошо сформированы при использовании фрагментов. Узнать больше о

Fragment transactions and Fragments

здесь ..

Мы надеемся, что BackgroundTask является вашим настраиваемым классом и не ожидает экземпляра фрагментов. Проверьте аргумент фоновой задачи, если он ищет контекстный проход getActivity ()

как насчет BackgroundTask b = new BackgroundTask (this);

DHRUV THAKKAR 25.06.2018 15:26

см. мое редактирование выше ... он не ищет экземпляр фрагмента в качестве аргумента ... проверьте, ищет ли конструктор BackgroundTask контекст ... если да, просто передайте свою активность, вызвав getActivity ()

Kannan_SJD 25.06.2018 15:29

Мне не хватает повторных занятий

DHRUV THAKKAR 26.06.2018 16:11

Попробуй это:

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

    t1 = view.findViewById(R.id.username);
    //do stuff with t1 obj

    return view;
}

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

public class BlankFragment3 extends Fragment {

public BlankFragment3() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment

    View view = inflater.inflate(R.layout.fragment_blank3, container, false);
     //element of xml file
    TextView mTxtTitle = (TextView) view.findViewById(R.id.txtTitle);
    mTxtTitle.setText("Helooooooo")

    return view;
}

}
Ответ принят как подходящий

В fragments для инициализации представлений и их использования вы должны раздуть макет фрагмента и сохранить его внутри переменной View следующим образом:

package com.example.dhruv.dez;
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class Profile extends Fragment {
    @Nullable
    private TextView t1;
    private View rootView;//View variable to save fragment layout and use it to initialize views and use them
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, 
    Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.profile, container, false);

        t1 = rootView.findViewById(R.id.username);
        return rootView;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);


        getActivity().setTitle("PROFILE");


    }

}

и если вам нужно передать контекст классу, подобному объявленному вами BackgroundTask, вы должны передать контекст следующим образом:

BackgroundTask b = new BackgroundTask(getActivity());

Для получения дополнительной информации о AsyncTaskin android см. официальную документацию это android об этом

Другие вопросы по теме