У меня действительно есть некоторые проблемы с кодированием приложения Android, которое должно ловить и отображать данные MySql с сервера на одном фрагменте и добавлять данные в базу данных MySQL на втором фрагменте.
Я следовал этому руководству дляПриложение MySql с использованием CRUD: Ссылка Приложение работало нормально!
Теперь я добавил нижнюю панель навигации с 3 фрагментами, и я не могу показать данные в этих фрагментах.Однако я могу перемещаться между фрагментами, показывающими простые текстовые представления.
Также я не могу удалить макет из activity_main.xml, потому что при этом компилятор выдает ошибку.Поэтому я установил содержимое невидимым (я знаю, это также нужно исправить).
Сначала я хочу показать только ListView с данными MySQL в первом фрагменте (testFragment).
Это содержимое MainActivity.java (я знаю, что в нем много кода, извините за это!):
package net.simplifiedlearning.myheroapp;
import android.support.v4.app.Fragment;
import android.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.app.ListFragment;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.BottomNavigationView;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.RatingBar;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.Toast;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import static android.view.View.GONE;
public class MainActivity extends AppCompatActivity {
private BottomNavigationView mMainNav;
private FrameLayout mMainFrame;
private TestFragment testFragment;
private AddFragment addFragment;
private SettingFragment settingFragment;
private static final int CODE_GET_REQUEST = 1024;
private static final int CODE_POST_REQUEST = 1025;
EditText editTextHeroId, editTextName;
ProgressBar progressBar;
ListView listView;
Button buttonAddUpdate;
List<Hero> heroList;
boolean isUpdating = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMainFrame = (FrameLayout) findViewById(R.id.main_frame);
mMainNav = (BottomNavigationView) findViewById(R.id.main_nav);
testFragment = new TestFragment();
addFragment = new AddFragment();
settingFragment = new SettingFragment();
mMainNav.setOnNavigationItemReselectedListener(new BottomNavigationView.OnNavigationItemReselectedListener() {
@Override
public void onNavigationItemReselected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.nav_list :
mMainNav.setItemBackgroundResource(R.color.colorPrimary);
setFragemt(testFragment);
return;
case R.id.nav_add :
mMainNav.setItemBackgroundResource(R.color.colorPrimary);
setFragemt(addFragment);
return;
case R.id.nav_setting :
mMainNav.setItemBackgroundResource(R.color.colorPrimary);
setFragemt(settingFragment);
}
}
private void setFragemt(Fragment fragment) {
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.main_frame, fragment);
fragmentTransaction.commit();
}
});
editTextHeroId = (EditText) findViewById(R.id.editTextHeroId);
editTextName = (EditText) findViewById(R.id.editTextName);
buttonAddUpdate = (Button) findViewById(R.id.buttonAddUpdate);
progressBar = (ProgressBar) findViewById(R.id.progressBar);
listView = (ListView) findViewById(R.id.listViewHeroes);
heroList = new ArrayList<>();
buttonAddUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isUpdating) {
updateHero();
} else {
createHero();
}
}
});
readHeroes();
}
private void createHero() {
String name = editTextName.getText().toString().trim();
if (TextUtils.isEmpty(name)) {
editTextName.setError("Please enter name");
editTextName.requestFocus();
return;
}
HashMap<String, String> params = new HashMap<>();
params.put("name", name);
PerformNetworkRequest request = new PerformNetworkRequest(Api.URL_CREATE_HERO, params, CODE_POST_REQUEST);
request.execute();
}
private void readHeroes() {
PerformNetworkRequest request = new PerformNetworkRequest(Api.URL_READ_HEROES, null, CODE_GET_REQUEST);
request.execute();
}
private void updateHero() {
String id = editTextHeroId.getText().toString();
String name = editTextName.getText().toString().trim();
if (TextUtils.isEmpty(name)) {
editTextName.setError("Please enter name");
editTextName.requestFocus();
return;
}
HashMap<String, String> params = new HashMap<>();
params.put("id", id);
params.put("name", name);
PerformNetworkRequest request = new PerformNetworkRequest(Api.URL_UPDATE_HERO, params, CODE_POST_REQUEST);
request.execute();
buttonAddUpdate.setText("Add");
editTextName.setText("");
isUpdating = false;
}
private void deleteHero(int id) {
PerformNetworkRequest request = new PerformNetworkRequest(Api.URL_DELETE_HERO + id, null, CODE_GET_REQUEST);
request.execute();
}
private void refreshHeroList(JSONArray heroes) throws JSONException {
heroList.clear();
for (int i = 0; i < heroes.length(); i++) {
JSONObject obj = heroes.getJSONObject(i);
heroList.add(new Hero(
obj.getInt("id"),
obj.getString("name"),
obj.getString("status_message"),
obj.getString("done_message"),
obj.getString("deadline_message")
));
}
HeroAdapter adapter = new HeroAdapter(heroList);
listView.setAdapter(adapter);
}
private class PerformNetworkRequest extends AsyncTask<Void, Void, String> {
String url;
HashMap<String, String> params;
int requestCode;
PerformNetworkRequest(String url, HashMap<String, String> params, int requestCode) {
this.url = url;
this.params = params;
this.requestCode = requestCode;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
progressBar.setVisibility(View.VISIBLE);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
progressBar.setVisibility(GONE);
try {
JSONObject object = new JSONObject(s);
if (!object.getBoolean("error")) {
Toast.makeText(getApplicationContext(), object.getString("message"), Toast.LENGTH_SHORT).show();
refreshHeroList(object.getJSONArray("heroes"));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
protected String doInBackground(Void... voids) {
RequestHandler requestHandler = new RequestHandler();
if (requestCode == CODE_POST_REQUEST)
return requestHandler.sendPostRequest(url, params);
if (requestCode == CODE_GET_REQUEST)
return requestHandler.sendGetRequest(url);
return null;
}
}
class HeroAdapter extends ArrayAdapter<Hero> {
List<Hero> heroList;
public HeroAdapter(List<Hero> heroList) {
super(MainActivity.this, R.layout.layout_hero_list, heroList);
this.heroList = heroList;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = getLayoutInflater();
View listViewItem = inflater.inflate(R.layout.layout_hero_list, null, true);
TextView textViewName = listViewItem.findViewById(R.id.textViewName);
TextView textViewDone_message = listViewItem.findViewById(R.id.textViewDone_message);
TextView textViewDeadline_message = listViewItem.findViewById(R.id.textViewDeadline_message);
TextView textViewStatus_message = listViewItem.findViewById(R.id.textViewStatus_message);
TextView textViewUpdate = listViewItem.findViewById(R.id.textViewUpdate);
TextView textViewDelete = listViewItem.findViewById(R.id.textViewDelete);
final Hero hero = heroList.get(position);
textViewName.setText(hero.getName());
textViewDone_message.setText(hero.getDone_message());
textViewDeadline_message.setText(hero.getDeadline_message());
textViewStatus_message.setText(hero.getStatus_message());
textViewUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
isUpdating = true;
editTextHeroId.setText(String.valueOf(hero.getId()));
editTextName.setText(hero.getName());
buttonAddUpdate.setText("Update");
}
});
textViewDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("Delete " + hero.getName())
.setMessage("Are you sure you want to delete it?")
.setPositiveButton(android.R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
deleteHero(hero.getId());
}
})
.setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
})
.setIcon(android.R.drawable.ic_dialog_alert)
.show();
}
});
return listViewItem;
}
}
}
Если я отображаю его сейчас в activity_mail.xml, оно работает нормально(конечно, с включенным visibiliy):
<?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"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context="net.simplifiedlearning.myheroapp.MainActivity">
<LinearLayout
android:id="@+id/linearLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="16dp"
android:visibility="invisible">
<EditText
android:id="@+id/editTextHeroId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone" />
<EditText
android:id="@+id/editTextName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp"
android:hint="Name" />
<Button
android:id="@+id/buttonAddUpdate"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Add" />
</LinearLayout>
<ListView
android:id="@+id/listViewHeroes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="invisible">
</ListView>
<ProgressBar
android:id="@+id/progressBar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone" />
<android.support.design.widget.BottomNavigationView
android:id="@+id/main_nav"
android:layout_width="match_parent"
android:layout_height="56dp"
android:layout_alignParentBottom="true"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
app:itemBackground="@color/colorPrimary"
app:itemIconTint="@color/nav_item_colors"
app:itemTextColor="@color/nav_item_colors"
app:menu="@menu/nav_items">
</android.support.design.widget.BottomNavigationView>
<FrameLayout
android:id="@+id/main_frame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_above="@id/main_nav"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true">
</FrameLayout>
</RelativeLayout>
Если я хочу отобразить ListView в TestFragment, он ничего не показывает: фрагмент_test.xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout 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"
tools:context=".TestFragment">
<!-- TODO: Update blank fragment layout -->
<ListView
android:id="@+id/listViewHeroes"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="visible">
</ListView>
</FrameLayout>
Я думаю, что долженотредактируйте TestFragment.java, но я не знаю, как ...:
package net.simplifiedlearning.myheroapp;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
/**
* A simple {@link Fragment} subclass.
*/
public class TestFragment extends Fragment {
public TestFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_test, container, false);
}
}
Я знаю, что это много кода, но я действительно застрял здесь.Я гуглил и пытался исправить это целый день ... Действительно надеюсь на некоторую помощь!Спасибо, ребята !!
Если вам нужно больше кода, пожалуйста, спрашивайте!