Как использовать элементы макета в классе фрагментов - PullRequest
0 голосов
/ 25 июня 2018

Здесь я сделал панель навигации в Android, используя фрагмент.
Теперь мне нужно распечатать свои данные, используя класс 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();
                }
            }

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

Ответы [ 6 ]

0 голосов
/ 25 июня 2018

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

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

0 голосов
/ 25 июня 2018

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

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

}
0 голосов
/ 25 июня 2018

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

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;
}
0 голосов
/ 25 июня 2018

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

Могу ли я узнать, почему существует проблема. И безопасно ли использовать fragmnets в проектах Android? Есть ли лучшие способы сделать это?

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

Фрагмент транзакции и фрагменты

здесь ..

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

0 голосов
/ 25 июня 2018

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

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

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

0 голосов
/ 25 июня 2018

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

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