2016-09-21 5 views
0

Ich versuche eine einfache Kommunikation zwischen 2 Fragmenten in einer Aktivität zu implementieren. Das erste Fragment hat eine Schaltfläche, die beim Drücken die aktuelle Zeit in Millisekunden an das zweite Fragment senden soll. Das zweite Fragment zeigt dies in einer Textansicht an. Nun, ich tue einfach nicht, was ich falsch mache. Java und XML-Dateien sind die folgendenAndroid Fragmente Kommunikation

package com.example.android.rssreader; 

import android.app.Activity; 
import android.app.FragmentManager; 
import android.app.FragmentTransaction; 
import android.os.Bundle; 
import android.widget.TextView; 

public class RssfeedActivity extends Activity implements MyListFragment.OnItemSelectedListener{ 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_rssfeed); 
    } 

    @Override 
    public void onRssItemSelected(String link) { 
     DetailFragment fragment = (DetailFragment) getFragmentManager() 
       .findFragmentById(R.id.detailFragment); 
     fragment.setText(link); 
    } 

} 

activity_rssfeed.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:baselineAligned="false" 
    android:orientation="horizontal" > 

    <fragment 
     android:id="@+id/listFragment" 
     android:layout_width="0dp" 
     android:layout_weight="1" 
     android:layout_height="match_parent" 
     class="com.example.android.rssreader.MyListFragment" 
     tools:layout="@layout/fragment_rsslist_overview"> 
    </fragment> 
    <fragment 
     android:id="@+id/detailFragment" 
     android:layout_width="0dp" 
     android:layout_weight="2" 
     android:layout_height="match_parent" 
     class="com.example.android.rssreader.DetailFragment" 
     tools:layout="@layout/fragment_rssitem_detail"> 
    </fragment> 

</LinearLayout> 

DetailFragment

package com.example.android.rssreader; 

/** 
* Created on 9/19/2016. 
*/ 
import android.app.Fragment; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class DetailFragment extends Fragment { 
    public static final String EXTRA_URL ="url"; 

    View view; 
    TextView txt; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     view = inflater.inflate(R.layout.fragment_rssitem_detail, 
       container, false); 
     txt = (TextView) view.findViewById(R.id.detailsText); 
     return view; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     Bundle bundle = getArguments(); 
     if (bundle != null) { 
      String link = bundle.getString("url"); 
      setText(link); 
     } 
    } 

    public void setText(String url) { 

     txt.setText(url); 
    } 
} 

fragment_rssitem_detail

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/detailsText" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_gravity="center_horizontal|center_vertical" 
     android:layout_marginTop="20dip" 
     android:text="@string/default_text" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:textSize="30dip" /> 

</LinearLayout> 

MyListFragment

package com.example.android.rssreader; 

/** 
* Created on 9/19/2016. 
*/ 
import android.app.Fragment; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.Button; 

public class MyListFragment extends Fragment { 

    private OnItemSelectedListener listener; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_rsslist_overview, 
       container, false); 
     Button button = (Button) view.findViewById(R.id.updateButton); 
     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       updateDetail("fake"); 
      } 
     }); 
     return view; 
    } 

    public interface OnItemSelectedListener { 
     void onRssItemSelected(String link); 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof OnItemSelectedListener) { 
      listener = (OnItemSelectedListener) context; 
     } else { 
      throw new ClassCastException(context.toString() 
        + " must implement MyListFragment.OnItemSelectedListener"); 
     } 
    } 

    // triggers update of the details fragment 
    public void updateDetail(String uri) { 
     // create fake data 
     String newTime = String.valueOf(System.currentTimeMillis()); 
     // send data to activity 
     listener.onRssItemSelected(newTime); 
    } 
} 

fragment_rsslist_overview

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <Button 
     android:id="@+id/updateButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Press to update" 
     /> 

</LinearLayout> 

Vielen Dank im Voraus für die in Vorschlag!

Der Stack-Trace

09/21 21:59:32: Launching app 
$ adb push E:\AndroidProjects\VogellaTut\RSSReader\app\build\outputs\apk\app-debug.apk /data/local/tmp/com.example.android.rssreader 
$ adb shell pm install -r "/data/local/tmp/com.example.android.rssreader" 
    pkg: /data/local/tmp/com.example.android.rssreader 
Success 


$ adb shell am start -n "com.example.android.rssreader/com.example.android.rssreader.RssfeedActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -D 
Waiting for application to come online: com.example.android.rssreader.test | com.example.android.rssreader 
Waiting for application to come online: com.example.android.rssreader.test | com.example.android.rssreader 
Waiting for application to come online: com.example.android.rssreader.test | com.example.android.rssreader 
Connecting to com.example.android.rssreader 
E/Trace: error opening trace file: No such file or directory (2) 
I/System.out: Sending WAIT chunk 
W/ActivityThread: Application com.example.android.rssreader is waiting for the debugger on port 8100... 
I/System.out: Debugger has connected 
I/System.out: waiting for debugger to settle... 
Connected to the target VM, address: 'localhost:8605', transport: 'socket' 
I/System.out: waiting for debugger to settle... 
I/System.out: waiting for debugger to settle... 
I/System.out: waiting for debugger to settle... 
I/System.out: waiting for debugger to settle... 
I/System.out: waiting for debugger to settle... 
I/System.out: waiting for debugger to settle... 
I/System.out: waiting for debugger to settle... 
I/System.out: debugger has settled (1453) 
V/ActivityThread: Class path: /data/app/com.example.android.rssreader-1.apk, JNI path: /data/data/com.example.android.rssreader/lib 
W/dalvikvm: VFY: unable to resolve virtual method 258: Landroid/app/Application;.registerOnProvideAssistDataListener (Landroid/app/Application$OnProvideAssistDataListener;)V 
W/dalvikvm: VFY: unable to resolve virtual method 261: Landroid/app/Application;.unregisterOnProvideAssistDataListener (Landroid/app/Application$OnProvideAssistDataListener;)V 
I/InstantRun: Instant Run Runtime started. Android package is com.example.android.rssreader, real application class is null. 
W/InstantRun: No instant run dex files added to classpath 
E/dalvikvm: Could not find class 'android.util.ArrayMap', referenced from method com.android.tools.fd.runtime.MonkeyPatcher.monkeyPatchExistingResources 
W/dalvikvm: VFY: unable to resolve check-cast 1885 (Landroid/util/ArrayMap;) in Lcom/android/tools/fd/runtime/MonkeyPatcher; 
E/dalvikvm: Could not find class 'android.util.ArrayMap', referenced from method com.android.tools.fd.runtime.MonkeyPatcher.pruneResourceCache 
W/dalvikvm: VFY: unable to resolve const-class 1885 (Landroid/util/ArrayMap;) in Lcom/android/tools/fd/runtime/MonkeyPatcher; 
W/dalvikvm: VFY: unable to resolve virtual method 310: Landroid/app/Fragment;.onAttach (Landroid/content/Context;)V 
I/Adreno200-EGL: <qeglDrvAPI_eglInitialize:299>: EGL 1.4 QUALCOMM build: (CL3050818) 
       Build Date: 01/18/13 Fri 
       Local Branch: lge_changes 
       Remote Branch: 
       Local Patches: 
       Reconstruct Branch: 
W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41d8d438) 
E/AndroidRuntime: FATAL EXCEPTION: main 
        java.lang.NullPointerException 
         at com.example.android.rssreader.MyListFragment.updateDetail(MyListFragment.java:53) 
         at com.example.android.rssreader.MyListFragment$1.onClick(MyListFragment.java:27) 
         at android.view.View.performClick(View.java:4101) 
         at android.view.View$PerformClick.run(View.java:17082) 
         at android.os.Handler.handleCallback(Handler.java:615) 
         at android.os.Handler.dispatchMessage(Handler.java:92) 
         at android.os.Looper.loop(Looper.java:137) 
         at android.app.ActivityThread.main(ActivityThread.java:4940) 
         at java.lang.reflect.Method.invokeNative(Native Method) 
         at java.lang.reflect.Method.invoke(Method.java:511) 
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:798) 
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:565) 
         at dalvik.system.NativeStart.main(Native Method) 
Disconnected from the target VM, address: 'localhost:8605', transport: 'socket' 
+0

Was passiert derzeit? Hast du kein Verhalten, stürzt es ab? – Ben

+0

Die App läuft und die Fragmente werden angezeigt, aber wenn ich den Knopf drücke, stürzt sie ab und eine Nachricht wird an meinem Telefon angezeigt, dass die App gestoppt wurde. – Giannis

+0

Was ist der Stack-Trace des Fehlers, der im Log erscheint bitte fügen Sie das zu Ihrer Frage hinzu . – Ben

Antwort