解雇警报对话框后应用程序崩溃(陷入循环())

时间:2018-06-01 14:42:54

标签: java android xml alertdialog

我正在尝试创建一个应用程序,您可以先在其中创建一个使用警报对话框命名的事件。然后,此事件将显示在ListView中。单击列表视图中的事件时,将打开另一个活动(activityDetailed)并显示有关该事件的详细信息。在此Activity中有另一个ListView,它显示不同的计数器。我的问题在于,每次单击FloatingActionButton创建并命名新计数器后,我都可以在Alert对话框中输入内容,但是当我按OK时,应用程序崩溃。我已经尝试过调试器,但它只是停留在Looper类的public static void loop()中。

我的详细活动代码:

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

}

(忽略&#34; NEEDS FIX&#34;部分,检查是否按下后退按钮,然后将数据传输到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)

1 个答案:

答案 0 :(得分:0)

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)

在您的CounterListAdapter.getView()中,您正在调用需要资源ID的TextView#setText(int)。您可能想要调用setText(CharSequence) - 在将int传递给TextView之前将其转换为String。