Здесь я сделал панель навигации в 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-проектах?
Есть ли лучшие способы сделать это?




Во фрагменте необходимо использовать:
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
t1 = (TextView) view.findViewById(R.id.username);
getActivity().setTitle("PROFILE");
}
сэр, почему это так, я никогда не использовал этот способ в обычном классе
Вы пытаетесь использовать функциональность действия, но фрагменты сильно отличаются от них. Вам нужно найти представления внутри RootView, поэтому вам нужно будет изменить строку на:
t1 = view.findViewById(R.id.username)
Также вам, вероятно, следует прочитать немного больше о фрагментах, если вы не знаете, как их использовать. Хорошей отправной точкой, вероятно, будет https://developer.android.com/guide/components/fragments
а как насчет BackgroundTask b = new BackgroundTask (this);
Я не знаю, какой BackgroundTask вы используете, но если вы хотите узнать о работе в другом потоке, я бы порекомендовал вам познакомиться с AsyncTasks, Loader или Services, просто погуглите эти ключевые слова, и вы, вероятно, найдете то, что вам нужно.
Этот макет находится в вашем параметре представления обратного вызова жизненного цикла 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);
см. мое редактирование выше ... он не ищет экземпляр фрагмента в качестве аргумента ... проверьте, ищет ли конструктор BackgroundTask контекст ... если да, просто передайте свою активность, вызвав getActivity ()
Мне не хватает повторных занятий
Попробуй это:
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 об этом
Этот макет находится в вашем параметре представления обратного вызова жизненного цикла onViewCreated. Поэтому используйте view.findViewById (YOUR_ID). Он должен работать. Или вы также можете использовать метод getView () в обратном вызове onActivityCreated () ..