aus MainActivity auf EditText aus anderer XML zugreifen

  • 17 Antworten
  • Letztes Antwortdatum
R

reneh

Neues Mitglied
0
hallo@community,

ich hab vor kurzem versucht, mit Androidprogrammierung zu beginnnen :D
Nun bin ich auch leider schon auf mein erstes Problem gestoßen. Mittels Google, Youtube und viel lesen habe ich in meiner MainActivity ein TabLayout erstellt. Dieses besteht aus der MainActivity.java (+ activity_main.xml) und weiteren Dateien wie
Fragment1.java + fragment1_layout.xml
Fragment2.java + fragment2_layout.xml
Fragment3.java + fragment3_layout.xml
...
Also für jeden Tab eine XML. Jetzt hab ich in meiner MainActivity.java folgenden Code:

editNachname = (EditText)findViewById(R.id.editText);
editVorname = (EditText)findViewById(R.id.editText2);
editPerso = (EditText)findViewById(R.id.editText3);
btnAddData = (Button)findViewById(R.id.button);

Diese Editfelder und Button liegen aber nicht in der activity_main.xml sonder in der fragment3_layout.xml. Ich habe bereits gemerkt, dass ich da nicht einfach so drauf zugreifen kann.
Wie kann ich denn in der MainActivity.java auf die anderen fragment_layout.xml-Dateinen zugreifen ?
 
Diese anderen Sachen müssen halt inflatet werden. Dazu nutzt man die Inflater API

Einfach mal anch "How to inflate Views from XML" googeln oder die Docs ansteuern :)


Frohes Fest
 
  • Danke
Reaktionen: reneh
ahja, das war schonmal n guter tip. mit den EditText hat es funktioniert. Da stürtzt nix mehr ab. Jedoch reagiert mein Button nicht. Ich habe es so versucht:

LayoutInflater inflater = (LayoutInflater)getApplicationContext().getSystemService (Context.LAYOUT_INFLATER_SERVICE);
View view_fragment1 = inflater.inflate(R.layout.fragment1_layout, null);

editNachname = (EditText)view_fragment1.findViewById(R.id.editText);
editVorname = (EditText)view_fragment1.findViewById(R.id.editText2);
editPerso = (EditText)view_fragment1.findViewById(R.id.editText3);
btnAddData = (Button)view_fragment1.findViewById(R.id.button);
AddData();

Muss des bei nem Button anders gemacht werden? Die Funktion AddDate() geht leider nicht mehr

public void AddData(){
btnAddData.setOnClickListener(
new View.OnClickListener() {
@override
public void onClick(View v) {
boolean isInserted = myDb.insertData(
editNachname.getText().toString(),
editVorname.getText().toString(),
editPerso.getText().toString());​
if (isInserted = true)
Toast.makeText(MainActivity.this, "alles i.o.", Toast.LENGTH_LONG).show();​
else
Toast.makeText(MainActivity.this, "alles mist", Toast.LENGTH_LONG).show();​
}​
}​

);​
}
 
Zuletzt bearbeitet:
sieht auf den ersten Blick OK aus. Was genau passiert denn, wenn du den Button drückst, stützt die App ab, oder tut sie einfach nichts?

ps benutz bitte den
Code:
[code]
Block, dann kann man es besser lesen
 
  • Danke
Reaktionen: reneh
naja, das ist ja das problem. die app tut nichts. ich hab bei google gelesen, dass man mit logcat fehler findet. wenn ich das level von logcat auf "error" stelle, bleibt es leer. wenn ich es auf "warn" stelle, kommt:

12-26 10:05:28.858 2476-2476/de.test.testprojekt_v5 W/dalvikvm: VFY: unable to find class referenced in signature (Landroid/view/SearchEvent;)
12-26 10:05:28.858 2476-2476/de.test.testprojekt_v5 W/dalvikvm: VFY: unable to resolve interface method 17966: Landroid/view/Window$Callback;.onSearchRequested (Landroid/view/SearchEvent;)Z
12-26 10:05:28.858 2476-2476/de.test.testprojekt_v5 W/dalvikvm: VFY: unable to resolve interface method 17970: Landroid/view/Window$Callback;.onWindowStartingActionMode (Landroid/view/ActionMode$Callback;I)Landroid/view/ActionMode;
12-26 10:05:29.268 2476-2476/de.test.testprojekt_v5 W/dalvikvm: VFY: unable to resolve virtual method 423: Landroid/content/res/TypedArray;.getChangingConfigurations ()I
12-26 10:05:29.278 2476-2476/de.test.testprojekt_v5 W/dalvikvm: VFY: unable to resolve virtual method 445: Landroid/content/res/TypedArray;.getType (I)I
12-26 10:05:31.058 2476-2476/de.test.testprojekt_v5 W/dalvikvm: VFY: unable to resolve virtual method 386: Landroid/content/res/Resources;.getDrawable (ILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;
12-26 10:05:31.068 2476-2476/de.test.testprojekt_v5 W/dalvikvm: VFY: unable to resolve virtual method 388: Landroid/content/res/Resources;.getDrawableForDensity (IILandroid/content/res/Resources$Theme;)Landroid/graphics/drawable/Drawable;


aber das ist eben kein fehler. daran kann es dann wohl nicht liegen :(


EDIT: ach du schei*e, ich hab jetzt 10000 errors im logcat. bei mir war irgendwie Regex eingestellt. deshalb gab es keine Anzeige der Fehler.
hier meine Fehler :(

[Java] 12-26 10:24:59.976 2602-2602/? E/memtrack: Couldn't load memtrack module (No suc - Pastebin.com
 
Zuletzt bearbeitet:
in welcher Methode werden denn die ganzen Zuweisungen durchgeführt und die AddData() Methode aufgerufen?
Wird diese vielleicht nicht oder nicht richtig aufgerufen. mit
Code:
Log.d(string, string);
kannst du selbst ins LogCat schreiben.
man mal bitte eine ausgabe an den Anfang und das Ende der AddData() Methode und an den Anfang und das Ende der onClick Methode, damit man sieht ob der Listener überhaupt angemeldet wird und ob er dann auch ausgelöst wird.
 
  • Danke
Reaktionen: reneh
reneh schrieb:
if (isInserted = true)
das ist im übrigen wahrscheinlich falsch entweder if(inInserted==true) oder besser noch if (isInserted)
[doublepost=1451144084,1451143721][/doublepost]Ok diese Fehlermeldung spricht eher dafür, dass etwas mit deinem Emulator nicht stimmt... aber dann hätte ich erwartet, dass die App gar nicht läuft...
Kannst du mal mit einem echten Gerät debuggen und gucken, was dann passiert?
 
  • Danke
Reaktionen: reneh
ok, if(isInserted) hab ich mal korrigiert. war aber noch nicht die Lösung.
japp, ich hau mal mein S3 Neo dran... mhhh, da läuft alles wie im Emu. Keine Fehler, keine Abstürze, einfach nix. Kann doch nicht so schwer sein. Der Button soll doch erst mal nur ne Meldung(Toast) ausgeben :angry: Wenn das jetzt schon so "schwierig" ist, will man gar nicht weitermachen :confused2:
 
Und du bist sicher, dass die methode AddData() aufgerufen wird?
 
naja, eigentlich bin ich mir da schon sicher. hier mal meine .java:

Code:
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    myDb = new SqlDbHelper(this);

    // hole mittels Inflater den Content aus einem anderen View/XML
    LayoutInflater inflater = (LayoutInflater)getApplicationContext().getSystemService
            (Context.LAYOUT_INFLATER_SERVICE);
    View view_fragment1 = inflater.inflate(R.layout.fragment1_layout, null);

    editNachname = (EditText)view_fragment1.findViewById(R.id.editText);
    editVorname = (EditText)view_fragment1.findViewById(R.id.editText2);
    editPerso = (EditText)view_fragment1.findViewById(R.id.editText3);
    btnAddData = (Button)view_fragment1.findViewById(R.id.button99);
    AddData();

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    viewpager = (ViewPager) findViewById(R.id.viewpager);

    ViewPagerAdapter1 viewPagerAdapter1 = new ViewPagerAdapter1(getSupportFragmentManager());
    viewpager.setAdapter(viewPagerAdapter1);

    tablayout = (TabLayout) findViewById(R.id.tablayout);
    tablayout.setTabGravity(TabLayout.GRAVITY_FILL);
    tablayout.setupWithViewPager(viewpager);
    tablayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
        @Override
        public void onTabSelected(TabLayout.Tab tab) {

            viewpager.setCurrentItem(tab.getPosition());
        }

        @Override
        public void onTabUnselected(TabLayout.Tab tab) {

        }

        @Override
        public void onTabReselected(TabLayout.Tab tab) {

        }
    });


}

public void AddData(){
    btnAddData.setOnClickListener(
            new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    boolean isInserted = myDb.insertData(
                            editNachname.getText().toString(),
                            editVorname.getText().toString(),
                            editPerso.getText().toString());
                    if (isInserted)
                        Toast.makeText(MainActivity.this, "alles i.o.", Toast.LENGTH_SHORT).show();
                    else
                        Toast.makeText(MainActivity.this, "alles mist", Toast.LENGTH_SHORT).show();
                }
            }

    );
}
 
für mich sieht das soweit ok aus, hast du mal probiert einen an den Anfang der onClick Methode zu setzen und dann Schrittweise zu debuggen um zu gucken wo er raus fliegt?
 
  • Danke
Reaktionen: reneh
Kann es sein, dass das mit dem Inflater falsch ist?
Die Funktion AddData() wird in der activity_main.java ausgeführt/aufgerufen.
Der Button liegt aber in der fragment1_layout.xml (dazu gehört die fragment1.java). Wenn ich in der fragment1_layout.xml den Button aufrufe, woher weiß die activity_main.java, dass die Funktion AddDate() aufzurufen ist??
 
Ja ich persönlich würde den OnClickListener auch in der .java Datei des Fragments programmieren, weil ich es ordentlicher fände, hätte aber gedacht es würde auch so gehen. Aber dann verschiebe doch mal die ganze AddData() Methode in die Fragment Klasse und Folgendes gehört dann auch in die onCreateView() Methode des Fragments:
Code:
    View view_fragment1 = inflater.inflate(R.layout.fragment1_layout, null);

    editNachname = (EditText)view_fragment1.findViewById(R.id.editText);
    editVorname = (EditText)view_fragment1.findViewById(R.id.editText2);
    editPerso = (EditText)view_fragment1.findViewById(R.id.editText3);
    btnAddData = (Button)view_fragment1.findViewById(R.id.button99);
    AddData();
 
  • Danke
Reaktionen: reneh
Alles übertragen in die fragment1.java... es ist zum Verzweifeln :unsure: Es passiert einfach nix. Keine Fehler, kein Absturz, nix.
Wenigstens funktioniert die App ohne Absturz :flapper: - auch wenn sie keine funktionierende Funktion hat :lol::lol:
 
hmm... kann ich mal die onCreateView Methode des Fragments sehen?
 
Klaro. Als Anfänger hat man doch nix zu verheimlichen :flapper:

Code:
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import android.view.LayoutInflater;

public class Fragment1 extends Fragment {

    View contentView1;

    EditText editNachname, editVorname, editPerso;
    Button btnAddData;
    SqlDbHelper myDb;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        // hole mittels Inflater den Content aus einem anderen View/XML
        View view_fragment1 = inflater.inflate(R.layout.fragment1_layout, null);

        contentView1 = inflater.inflate(R.layout.fragment1_layout, null);

        editNachname = (EditText)view_fragment1.findViewById(R.id.editText);
        editVorname = (EditText)view_fragment1.findViewById(R.id.editText2);
        editPerso = (EditText)view_fragment1.findViewById(R.id.editText3);
        btnAddData = (Button)view_fragment1.findViewById(R.id.button99);
        AddData();

        return contentView1;
    }



    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {

        super.onViewCreated(view, savedInstanceState);
    }

    public void AddData(){
        btnAddData.setOnClickListener(
                new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        boolean isInserted = myDb.insertData(
                                editNachname.getText().toString(),
                                editVorname.getText().toString(),
                                editPerso.getText().toString());
                        if (isInserted)
                            Toast.makeText(getActivity().getApplicationContext(), "alles i.o.", Toast.LENGTH_SHORT).show();
                        else
                            Toast.makeText(getActivity().getApplicationContext(), "alles mist", Toast.LENGTH_SHORT).show();
                    }
                }

        );
    }
}
 
Ändere die mal wie folgt ab:
Code:
   @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

       
        contentView1 = inflater.inflate(R.layout.fragment1_layout, null);

        editNachname = (EditText)contentView1 .findViewById(R.id.editText);
        editVorname = (EditText)contentView1 .findViewById(R.id.editText2);
        editPerso = (EditText)contentView1 .findViewById(R.id.editText3);
        btnAddData = (Button)contentView1 .findViewById(R.id.button99);
        AddData();

        return contentView1;
    }
[doublepost=1451169292,1451169203][/doublepost]Ach und myDb ist noch null
 
Zurück
Oben Unten