Я пытаюсь создать приложение, в котором вы можете сначала создать событие, которое вы называете с помощью диалога предупреждений.Это событие затем отображается в ListView.Когда вы щелкаете событие в представлении списка, открывается другое действие (ActivityDetailed), в котором отображается подробная информация о событии.В этом действии есть еще один ListView, который отображает разные счетчики.Моя проблема здесь в том, что каждый раз, когда я нажимаю кнопку FloatingActionButton, чтобы создать и присвоить имя новому счетчику, я могу что-то ввести в диалог оповещения, но когда я нажимаю ОК, приложение вылетает.Я уже пробовал отладчик, но он просто застревает в общедоступном статическом цикле void () из класса Looper.
Мой подробный код активности:
public class detailedActivity extends AppCompatActivity {
private String detailName = "";
private ArrayList<Counter> counterList = new ArrayList<Counter>();
private Context cntxt = this;
private int counterId = 0;
private Handler mainHandler;
private ListView counterListView;
private CounterListAdapter counterListAdapter;
private int eventId = 0;
public void setDetailName (String pName){
detailName = pName;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_detailed);
String[] counterArray = getIntent().getStringArrayExtra("extra_counter");
for(int i=0; i<counterArray.length; i++){
String[] args = counterArray[i].split("|");
counterList.add(new Counter(i, args[0], 1, Integer.valueOf(args[1])));
}
eventId = getIntent().getIntExtra("extra_id", 0);
TextView nameText = (TextView) findViewById(R.id.nameText);
nameText.setText(getIntent().getStringExtra("extra_name"));
counterListView = (ListView) findViewById(R.id.counterListView);
counterListAdapter = new CounterListAdapter(this, counterList);
counterListView.setAdapter(counterListAdapter);
FloatingActionButton myFab = (FloatingActionButton) findViewById(R.id.plusCounterFAB);
myFab.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(cntxt);
builder.setTitle("Add a new Counter");
final View viewInflated = LayoutInflater.from(cntxt).inflate(R.layout.text_input_name, /*(ViewGroup) findViewById(android.R.id.content)*/null, false);
final EditText input = (EditText) viewInflated.findViewById(R.id.input);
builder.setView(viewInflated);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
counterList.add(new Counter(counterList.size(), input.getText().toString(), 1, 0)); ////crashes on loop
update();
if(!detailedActivity.this.isFinishing() && dialog!=null) {
dialog.dismiss();
}
}
});
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.show();
}
});
}
////////////////////////////////////////NEEDS FIX//////////////////////////////////////////////
/* @Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
String[] tmp = new String[counterList.size()];
for(int i=0; i<tmp.length; i++){
tmp[i] = counterList.get(i).getName()+"|"+counterList.get(i).getX();
}
Intent returnIntent = new Intent();
returnIntent.putExtra("result",tmp);
returnIntent.putExtra("resultID", eventId);
setResult(MainActivity.RESULT_OK,returnIntent);
finish();
return false;
}
return super.onKeyDown(keyCode, event);
}*/
////////////////////////////////////////////////////////////////////////
public void update(){
counterListAdapter = new CounterListAdapter(this, counterList);
counterListView = (ListView) findViewById(R.id.counterListView);
counterListView.setAdapter(counterListAdapter);
}
}
(игнорируйте часть «NEEDS FIX»), он должен проверить, если вы нажмете кнопку «Назад», а затем перенесете данные в mainActivity)
Мой код mainActivity:
public class MainActivity extends AppCompatActivity {
private Context contxt = this;
private List<Event> eventList = new ArrayList<Event>();
private ListView eventListView;
private EventListAdapter adapter;
private ListView counterListView;
private ListAdapter counterAdapter;
private int eventId = 0;
private String currEventName = "Name";
private database db = new database();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
adapter = new EventListAdapter(contxt,eventList);
eventListView = (ListView) findViewById(R.id.eventList);
eventListView.setAdapter(adapter);
eventListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
Toast.makeText(getApplicationContext(), "Clicked id: "+view.getTag(), Toast.LENGTH_SHORT).show();
//open Activity
Intent intentDet = new Intent(MainActivity.this, detailedActivity.class);
intentDet.putExtra("extra_name", eventList.get(position).getEventName());
intentDet.putExtra("extra_counter", eventList.get(position).getCounterArray());
intentDet.putExtra("extra_id", position);
startActivityForResult(intentDet,1);
}
});
FloatingActionButton myFab = (FloatingActionButton) findViewById(R.id.plusFAB);
myFab.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(contxt);
builder.setTitle("Add a new Event");
final View viewInflated = LayoutInflater.from(contxt).inflate(R.layout.text_input_name, (ViewGroup) findViewById(android.R.id.content), false);
final EditText input = (EditText) viewInflated.findViewById(R.id.input);
builder.setView(viewInflated);
builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String eventName = input.getText().toString();
Date date = new Date();
eventList.add(new Event(eventName,date,eventId));
eventId++;
update();
dialog.dismiss();
}
});
builder.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
builder.show();
}
});
}
public void update(){
adapter = new EventListAdapter(contxt,eventList);
eventListView = (ListView) findViewById(R.id.eventList);
eventListView.setAdapter(adapter);
}
public String getCurrentEventName(){
return currEventName;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 1) {
if(resultCode == MainActivity.RESULT_OK){
String[] result = data.getStringArrayExtra("result");
int pos = data.getIntExtra("resultID", 0);
ArrayList<Counter> tmpList = new ArrayList<Counter>();
for(int i=0; i<result.length; i++){
String[] args = result[i].split("|");
tmpList.add(new Counter(i, args[0], 1, Integer.valueOf(args[1])));
}
db.editArrayList(pos, tmpList);
}
if (resultCode == MainActivity.RESULT_CANCELED) {}
}
}
}
Activity_detailed.xml:
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.marcleibold.counter.detailedActivity">
<android.support.design.widget.FloatingActionButton
android:id="@+id/plusCounterFAB"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|right|end"
android:layout_margin="14dp"
app:backgroundTint="@android:color/holo_orange_dark"
app:srcCompat="@drawable/plus"
tools:layout_editor_absoluteX="304dp"
tools:layout_editor_absoluteY="455dp" />
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/nameText"
android:layout_width="match_parent"
android:layout_height="45dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
android:text="Name"
android:textColor="@android:color/background_dark"
android:textSize="30dp"
android:textStyle="bold"
android:visibility="visible"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ListView
android:id="@+id/counterListView"
android:layout_width="368dp"
android:layout_height="450dp"
android:layout_marginStart="8dp"
android:layout_marginTop="8dp"
app:layout_anchor="@+id/nameText"
app:layout_anchorGravity="bottom|center"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/nameText" />
</android.support.constraint.ConstraintLayout>
</android.support.design.widget.CoordinatorLayout>
Это исключение, которое я получаю:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.marcleibold.counter, PID: 11251
android.content.res.Resources$NotFoundException: String resource ID #0x0
at android.content.res.Resources.getText(Resources.java:331)
at android.widget.TextView.setText(TextView.java:4554)
at com.example.marcleibold.counter.CounterListAdapter.getView(CounterListAdapter.java:48)
at android.widget.AbsListView.obtainView(AbsListView.java:2362)
at android.widget.ListView.makeAndAddView(ListView.java:1970)
at android.widget.ListView.fillDown(ListView.java:704)
at android.widget.ListView.fillFromTop(ListView.java:765)
at android.widget.ListView.layoutChildren(ListView.java:1744)
at android.widget.AbsListView.onLayout(AbsListView.java:2161)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.support.constraint.ConstraintLayout.onLayout(ConstraintLayout.java:1197)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.support.design.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1166)
at android.support.design.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:851)
at android.support.design.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:870)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:443)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:724)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2342)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2069)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6301)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
at android.view.Choreographer.doCallbacks(Choreographer.java:683)
at android.view.Choreographer.doFrame(Choreographer.java:619)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)