Код данной активити получает ответ от сервера и по задумке должен отправить результат во фрагмент.
public void Okhhtp(){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(link)
.build();
Call call = client.newCall(request);
call.enqueue(new
Callback() {
@Override
public void onFailure (Call call, IOException e){
Toast.makeText(MainActivity.this, "Text loaded", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse (Call call, Response response) throws IOException {
final String result = response.body().string();
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
Bundle bundle = new Bundle();
bundle.putString("a", result);
dialogFragment.setArguments(bundle);
Toast.makeText(MainActivity.this,result, Toast.LENGTH_SHORT).show();
}
});
}
});
}
ответ от сервера пришел, об этом говорит "тост" содержащий ответ сервера, фрагмент открылся, об этом говорит текст вью отображающееся на экране, но содержимое ответа не передается во фрагмент.. в текст вью.
код Fragment
public class DialogFragment extends Fragment {
String b;
TextView text;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_dialog, container, false);
text = (TextView)view.findViewById(R.id.textView3);
Bundle bundle = this.getArguments();
if (bundle != null) {
b = bundle.getString("a");
text.setText(b);
}
return view;
}
Кусок кода открытия фрагмента
if (id == R.id.nav_camera) {
fragmentClass = DialogFragment.class;
try {
Okhhtp();
} catch (Exception e) {
e.printStackTrace();
}
весь код главного активити
public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener {
com.witryna.Fragment.DialogFragment dialogFragment = new com.witryna.Fragment.DialogFragment();
public String a = "gfgf";
OkHttpClient client = new OkHttpClient();
ArrayList<Sdialog> UpList = new ArrayList<>();
Bundle bundle= new Bundle();
ProfilFragment profilFragment = new ProfilFragment();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//FragmentManager fragmentManager = getSupportFragmentManager();
//fragmentManager.beginTransaction() // получаем экземпляр FragmentTransaction
//.replace(R.id.container, dialogFragment).commit(); // вызываем commit для совершения действий FragmentTransaction
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
fab.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();
}
});
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
drawer.setDrawerListener(toggle);
toggle.syncState();
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setNavigationItemSelectedListener(this);
//bundle = new Bundle();
}
@Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
super.onBackPressed();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
Fragment fragment = null;
Class fragmentClass = null;
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_camera) {
fragmentClass = com.witryna.Fragment.DialogFragment.class;
try {
Okhhtp();
} catch (Exception e) {
e.printStackTrace();
}
} else if (id == R.id.nav_gallery) {
fragmentClass = ProfilFragment.class;
try {
Okhhtp();
} catch (Exception e) {
e.printStackTrace();
}
} else if (id == R.id.nav_slideshow) {
fragmentClass = DialogFragment.class;
} else if (id == R.id.nav_manage) {
fragmentClass = DialogFragment.class;
} else if (id == R.id.nav_share) {
fragmentClass = DialogFragment.class;
} else if (id == R.id.nav_send) {
fragmentClass = DialogFragment.class;
}
try {
fragment = (Fragment) fragmentClass.newInstance();
} catch (Exception e) {
e.printStackTrace();
}
// Вставляем фрагмент, заменяя текущий фрагмент
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.container, fragment).commit();
// Выделяем выбранный пункт меню в шторке
item.setChecked(true);
// Выводим выбранный пункт в заголовке
setTitle(item.getTitle());
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
drawer.closeDrawer(GravityCompat.START);
return true;
}
public void Okhhtp(){
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("http://123.party/")
.build();
Call call = client.newCall(request);
call.enqueue(new
Callback() {
@Override
public void onFailure (Call call, IOException e){
Toast.makeText(MainActivity.this, "Text loaded", Toast.LENGTH_SHORT).show();
}
@Override
public void onResponse (Call call, Response response) throws IOException {
final String result = response.body().string();
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
// Bundle bundle = new Bundle();
// bundle.putString("a", result);
//dialogFragment.setArguments(bundle);
dialogFragment.setResult(result);
Toast.makeText(MainActivity.this,result, Toast.LENGTH_SHORT).show();
}
});
}
});
}
}
Что я делаю не правильно ?
Суть в том, что ответ от сервера вы получаете асинхронно. То есть, в момент когда вызывается onResponse
у коллбека, метод фрагмента onCreateView
уже отработал с null аргументами.
Сделайте отдельный метод во фрагменте, в который будете передавать результат и устанавливать его в TextView
:
public void setResult(String result) {
text.setText(result);
}
И вызывайте его вместо setArguments()
:
...
@Override
public void onResponse (Call call, Response response) throws IOException {
final String result = response.body().string();
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
dialogFragment.setResult(result);
Toast.makeText(MainActivity.this,result, Toast.LENGTH_SHORT).show();
}
});
}
...
Таким образом у вас сначала откроется фрагмент, а после получения ответа от сервера заполнится TextView
.
Проблема с NullPointerException
возникает из за того, что вы инициализируете com.witryna.Fragment.DialogFragment dialogFragment = new com.witryna.Fragment.DialogFragment();
вначале и ничего с ним не делаете. А потом пытаетесь обратиться к нему. Так как он не добавлен во фрагмент менеджер, у него не отработали методы ЖЦ и TextView не проинициализировался. Исправьте так:
@SuppressWarnings("StatementWithEmptyBody")
@Override
public boolean onNavigationItemSelected(MenuItem item) {
Fragment fragment = null;
// Handle navigation view item clicks here.
int id = item.getItemId();
if (id == R.id.nav_camera) {
fragment = DialogFragment.newInstance();
dialogFragment = fragment;
try {
Okhhtp();
} catch (Exception e) {
e.printStackTrace();
}
}
...
// Вставляем фрагмент, заменяя текущий фрагмент
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction().replace(R.id.container, fragment).commit();
...
}
Добрый день! Есть web-приложениеAppConfig
Как реализовать удобный фильтр по параметрам при работе с бд? Есть определенные параметры, к примеру цвет, длина, вес которые приходят с UIВ контроллере...
Есть массив из n элементов, и есть массив из k элементов, так вот, мне нужно что бы К массив заполнялся элементами из n, но при условии что n < k