Mit For-Schleife ContentValue Arrays erzeugen

  • 5 Antworten
  • Neuester Beitrag
Diskutiere Mit For-Schleife ContentValue Arrays erzeugen im Android App Entwicklung im Bereich Betriebssysteme & Apps.
T

Tom Com

Fortgeschrittenes Mitglied
Hallo!
Ich wollte eine Test-APP erstellen, bei der man in ein Eingabefeld einen Namen und in ein anderes eine Telefonnummer eingibt. Drückt man einen Button kann man eine neue Nummer hinzufügen, drückt man nochmal noch eine Nummer... Anschließend wird alles in die Kontakte App eingetragen. Derzeit sieht meine Anwendung so aus:
MainActivity.java
Code:
package test.kontakte;

import android.app.ActionBar;
import android.app.Activity;
import android.content.ContentValues;
import android.content.Intent;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.text.InputType;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

import java.util.ArrayList;

public class MainActivity extends Activity {

    EditText editText, editText2, editText3;
    Button button;
    Button button2;
    LinearLayout ll;
    int integer = 0;
    private static final int RQ = 1234;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText)findViewById(R.id.editText);
        editText2 = (EditText)findViewById(R.id.editText2);
         ContentValues[] v2;
        ll = (LinearLayout)findViewById(R.id.ll);
        button = (Button)findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener()
       {
            @Override
            public void onClick(View v) {
                String name = editText.getText().toString();
                String number = editText2.getText().toString();
                Intent i = new Intent(Intent.ACTION_INSERT, ContactsContract.Contacts.CONTENT_URI);
                i.putExtra("finishActivityOnSaveCompleted", true);
                i.putExtra(ContactsContract.Intents.Insert.NAME, name);
                ArrayList<ContentValues> list = new ArrayList<ContentValues>();
                ContentValues v1 = new ContentValues();
                v1.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
                v1.put(ContactsContract.CommonDataKinds.Phone.NUMBER, number);
                v1.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_HOME);
                list.add(v1);
                if(integer > 0){
                    ContentValues[] v2 = new ContentValues[integer];
                        for(int integer2 = 1; integer2<integer; integer2++) {
                            int number2 = Integer.parseInt(editText3.getText().toString());
                            v2[integer2 - 1].put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
                            v2[integer2 - 1].put(ContactsContract.CommonDataKinds.Phone.NUMBER, number2);
                            v2[integer2 - 1].put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_HOME);
                            list.add(v2[integer2 - 1]);
                        }


                }
                //i.putExtra(ContactsContract.Intents.Insert.PHONE, number);
                //i.putExtra(ContactsContract.Intents.Insert.PHONE_TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_HOME);
                i.putParcelableArrayListExtra(ContactsContract.Intents.Insert.DATA, list);
                startActivityForResult(i, RQ);
            }
        });
        button2 = (Button)findViewById(R.id.button2);
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                integer++;
                editText3 = new EditText(MainActivity.this);
                editText3.setInputType(InputType.TYPE_CLASS_NUMBER);
                LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                lp.setMargins(20, 30, 20, 0);
                ll.addView(editText3, lp);

            }
        });

    }
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data){
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RQ){
            if (resultCode == RESULT_OK){
                if (data != null){
                    Intent in = new Intent(Intent.ACTION_VIEW, data.getData());
                    startActivity(in);
                }
            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.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);
    }
}
activity_main.xml
Code:
<LinearLayout 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" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"
    android:orientation="vertical"
    android:id="@+id/ll">

    <TextView android:text="@string/hello_world" android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/textView"
        android:textSize="@dimen/activity_vertical_margin" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/editText"
        android:layout_below="@+id/textView"
        android:layout_alignParentStart="true"
        android:hint="@string/name" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="phone"
        android:ems="10"
        android:id="@+id/editText2"
        android:layout_below="@+id/editText"
        android:layout_alignParentStart="true"
        android:layout_alignEnd="@+id/editText"
        android:hint="@string/number" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/button"
        android:id="@+id/button"
        android:layout_below="@+id/editText2"
        android:layout_alignParentStart="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/add"
        android:id="@+id/button2" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="phone"
        android:ems="10"
        android:id="@+id/editText3"
        android:longClickable="false"
        android:visibility="invisible" />

</LinearLayout>

Doch da kriege ich dann folgende Fehlermeldung, wenn ich drei Nummern eingebe:
Code:
07-01 04:48:30.080    1894-1894/test.kontakte E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: test.kontakte, PID: 1894
    java.lang.NullPointerException: Attempt to invoke virtual method 'void android.content.ContentValues.put(java.lang.String, java.lang.String)' on a null object reference
            at test.kontakte.MainActivity$1.onClick(MainActivity.java:59)
            at android.view.View.performClick(View.java:4780)
            at android.view.View$PerformClick.run(View.java:19866)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
Was muss ich ändern, damit meine App läuft?
Danke für Antworten!
 
Jaiel

Jaiel

Experte
Ich glaube du hast V2 nicht initialisiert sondern nur das Array deklariert:

PHP:
if(integer > 0){
ContentValues[] v2 = new ContentValues[integer];
//jetzt arbeitest du sofort damit ohne initialisierung
for(int integer2 = 1; integer2<integer; integer2++) {
int number2 = Integer.parseInt(editText3.getText().toString());
v2[integer2 - 1].put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
v2[integer2 - 1].put(ContactsContract.CommonDataKinds.Phone.NUMBER, number2);
v2[integer2 - 1].put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_HOME);
list.add(v2[integer2 - 1]);
}


}
Vorschlag: Arraylist wo du die neuen Views einfach addest.
 
Zuletzt bearbeitet:
T

Tom Com

Fortgeschrittenes Mitglied
Kann man auch irgendwie das v2 array initialisieren?

Ich habe es jetzt mal so versucht:
Code:
if(integer > 0){
                   
                        for(int integer2 = 1; integer2<integer; integer2++) {
                            ContentValues values = new ContentValues();
                            int number2 = Integer.parseInt(editText3.getText().toString());
                            values.put(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE);
                            values.put(ContactsContract.CommonDataKinds.Phone.NUMBER, number2);
                            values.put(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_HOME);
                            list.add(values);
                        }
Jetzt wird aber immer nur die zuletzt eingegebene Nummer gewertet:crying:
 
Zuletzt bearbeitet:
Jaiel

Jaiel

Experte
Wei´ßt du cnith wie man Arrays initilisiert?

Object[] object=new Object[Integer];
for(int i=0;i<Integer;i++)
{
object=new Object();
}


Deine For schleife ist auch komisch...möchtest du cniht den letzten v2 in der Liste haben oder wie?

für mcih sollte die Schleife so aussehen
for(integer2=0;integer1<integer;integer2++)
{
v2[integer2]
...


oder aus "integer2<integer" ein "integer2<=integer" machen


dann könntest du einfach oben die Zeile v2[integer2]=new ContenValue();

platzieren und alles ist gut
 
T

Tom Com

Fortgeschrittenes Mitglied
Danke! Jetzt kommt die Fehlermeldung nicht mehr, aber wenn man mehrere Nummern eingibt dann erscheint immer nur die letzte. Ich denke der Fehler liegt daran, dass immer EditText3 überschrieben wird, oder?
Hier nochmals die onClick:
Code:
@Override
            public void onClick(View v) {
                integer++;
                editText3 = new EditText(MainActivity.this);
                editText3.setInputType(InputType.TYPE_CLASS_NUMBER);
                LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
                lp.setMargins(20, 30, 20, 0);
                ll.addView(editText3, lp);

            }
 
Jaiel

Jaiel

Experte
Ja das kannst du damit lösen indem du eine liste mit edittexts führst