2017-12-07 4 views
0

ich arbeite an einer NotePad-Anwendung, weil ich SQLite ausprobieren wollte und ich keine richtige NotePad-App auf meinem Smartphone habe.Wie initialisiere ich einen EditText, wenn die Methode des Fragments aus der Aktivität aufgerufen wird?

Screenshot of the app

So ist meine Anwendung einer Aktivität zusammengesetzt, die eine Viewpager und ein Menü enthält für die Notiz speichern, eine neue Notiz erstellen oder die aktuelle Notiz löschen, und ein Fragment, wo ein einfaches EditText ist.

Ich erstelle ein benutzerdefiniertes Objekt Hinweis, der aus einem String-Titel, einem String-Inhalt und einer Integer-ID besteht, um die Daten auf SQLite zu speichern.

Also mein Problem ist für die Funktionality des Speicherns der Notiz in meiner Datenbank.

Es beginnt mit dem Menü in der Aktionsleiste der Aktivität, also, wenn ich auf die Schaltfläche zum Speichern (die zweite, die wie eine SD-Karte aussehen), rief ich eine Methode aus meinem Fragment zum Bearbeiten der Notiz auf der Datenbank wie folgt aus:

private void save() { 
    TabFragment fragment = new TabFragment(); 
    fragment.editNote(arrayListTitle); 
} 

der Arraylist enthält den Titel jeder Note (ich verwende ihn für die TabLayout erstellen) und ich übergeben ihn für den Titel der Notiz zu erhalten.

So gibt es den Code meines Fragment:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    rootview = (ViewGroup) inflater.inflate(R.layout.fragment_tab, container, false); 
    editText1 = rootview.findViewById(R.id.editText1); 

    manager = new NoteManager(getActivity()); 
    manager.open(); 

    Bundle args = getArguments(); 
    position = args.getInt("0"); 
    arrayListContent = args.getStringArrayList("1"); 

    editText1.setText(arrayListContent.get(position)); 
    return rootview; 
} 

public void editNote(ArrayList<String> arrayListTitle) { 
    title_edit = arrayListTitle.get(position); 
    content_edit = editText1.getText().toString(); 
    Note note = manager.getNote(position + 1); 

    note.setTitle(title_edit); 
    note.setContent(content_edit); 
    manager.modNote(note); 
} 

Wenn ich in der editNote Methode gehen erhalte ich die Fehlermeldung:

E/AndroidRuntime: FATAL EXCEPTION: main 
       Process: fr.pensebete, PID: 24165 
       java.lang.NullPointerException: Attempt to invoke virtual method 'android.text.Editable android.widget.EditText.getText()' on a null object reference 
        at fr.pensebete.TabFragment.editNote(TabFragment.java:50) 
        at fr.pensebete.MainActivity.save(MainActivity.java:130) 
        at fr.pensebete.MainActivity.onOptionsItemSelected(MainActivity.java:101) 
        at android.app.Activity.onMenuItemSelected(Activity.java:3369) 
        at android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:368) 
        at android.support.v7.app.AppCompatActivity.onMenuItemSelected(AppCompatActivity.java:195) 
        at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:108) 
        at android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected(WindowCallbackWrapper.java:108) 
        at android.support.v7.app.ToolbarActionBar$2.onMenuItemClick(ToolbarActionBar.java:65) 
        at android.support.v7.widget.Toolbar$1.onMenuItemClick(Toolbar.java:202) 
        at android.support.v7.widget.ActionMenuView$MenuBuilderCallback.onMenuItemSelected(ActionMenuView.java:780) 
        at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:822) 
        at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:171) 
        at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:973) 
        at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:963) 
        at android.support.v7.widget.ActionMenuView.invokeItem(ActionMenuView.java:624) 
        at android.support.v7.view.menu.ActionMenuItemView.onClick(ActionMenuItemView.java:150) 
        at android.view.View.performClick(View.java:6213) 
        at android.widget.TextView.performClick(TextView.java:11074) 
        at android.view.View$PerformClick.run(View.java:23645) 
        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:6692) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1468) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1358) 

Ich kenne sein, weil die EditText nicht initialisiert werden, da i nur die Methode editNote() aufgerufen und OnCreateView wird nicht aufgerufen.

Wie kann ich die EditNote() -Methode von der Aktivität aufrufen und den EditText und die Variablenposition korrekt initialisieren (wie in der OnCreateView-Methode)? Kannst du mir helfen, weil ich seit 3 ​​Stunden ohne eine Lösung suche, um es zu arbeiten.

Vielen Dank für Ihre Zeit und Ihre Hilfe, und Entschuldigung für mein schlechtes Englisch.

Edit: Während ich diese Frage, die ich seine vielleicht erkennen, schreiben, weil ich eine neue TabFragment in meiner Tätigkeit Methode tun:

private void save() { 
    TabFragment fragment = new TabFragment(); 
    fragment.editNote(arrayListTitle); 
} 

Vielleicht muss ich erhalten oder das aktuelle Fragment bereits erstellt finden, aber ich weiß nicht weiß, wie man das macht. HILFE !

+0

Verwenden Sie Ihre Fragmentinstanz, anstatt ein neues Fragment zu erstellen. –

+0

Ja, ich denke darüber nach, aber wie kann ich das tun? –

+0

siehe meine Antwort unten. –

Antwort

0

Versuchen Sie folgendes:

private void save() { 
    TabFragment fragment = getFragmentManager().findFragmentByTag("Tag"); 
    fragment.editNote(arrayListTitle); 
} 

sicher sein, dass, wenn Sie Ihr Fragment erstellen t Sie das Tag wie so gesetzt:

getFragmentManager().beginTransaction().replace(R.id.frame, new TabFragment(), "Tag").commit(); 
+0

danke für deine Antwort!, Dies ist der Code meines ViewPager-Adapters zum Erstellen des Fragments: 'TabFragment tab1 = new TabFragment(); Rückkehr tab1; } ' Wie Sie sehen, ich benutze keine Fragment Manager, weißt du, kann ich ein Tag mit dieser Methode hinzufügen? –

0

Zum Beispiel beziehen sich diese

https://github.com/codepath/android_guides/wiki/ViewPager-with-FragmentPagerAdapter

In der Aktivitätsklasse

public class MainActivity extends AppCompatActivity { 

Adapter adapterViewPager; //Replace with your adapter 
ViewPager vpPager; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_home); 
    vpPager = (ViewPager) findViewById(R.id.vpPager); 
    adapterViewPager = new ViewPagerAdapter(getSupportFragmentManager()); 
    vpPager.setAdapter(adapterViewPager); 
} 

private void save() { 
    TabFragment fragment = vPager.getItem(0) //position to which fragment 
    fragment.editNote(arrayListTitle); 
} 
} 

Hoffe es hilft.!

Verwandte Themen