2017-05-22 4 views
0

Ich erstelle eine einfache Anwendung Kommunikation Fragment, aber wenn ich die App laufen wil es sagenFragment Interface-Methode nicht aufrufen

Attempt to invoke interface method 'void com.example.owner.fragcom.fragment_one$OnnamesetListener.setname(java.lang.String)' on a null object reference 

Ich denke, das Problem mit setname Methode, aber ich did't nicht, was schief gehen Kann mir jemand sagen, dass das Problem ist, dass ich meinen Code hier unten einfügen.

public class fragment_one extends Fragment { 
EditText etd; 
Button button; 
OnnamesetListener onnamesetListener; 


@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_one_layout,container,false); 

    etd = (EditText)view.findViewById(R.id.frag_one); 
    button =(Button)view.findViewById(R.id.send); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      String name = etd.getText().toString(); 
      onnamesetListener.setname(name); 
     } 
    }); 
    return view; 
} 



public interface OnnamesetListener{ 

    public void setname(String name); 


} 


@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
      try { 

    onnamesetListener = (OnnamesetListener) context; 



    }catch (Exception e){} 

} 

}

dies ist mein Code für Fragment eines hier i ein Bearbeiten von Text gesetzt und diesen Wert übergeben zwei durch Haupttätigkeit fragmentieren.

Haupttätigkeit

public class MainActivity extends AppCompatActivity implements fragment_one.OnnamesetListener { 

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

@Override 
public void setname(String name) { 


    fragment_two f2 =(fragment_two) getFragmentManager().findFragmentById(R.id.fragment_two); 
    f2.UpdateInfo(name); 

} 

}

Fragment Zwei

public class fragment_two extends Fragment { 

TextView textView; 


@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_two_layout,container,false); 

    textView = (TextView)view.findViewById(R.id.textView); 

    return view; 
} 

public void UpdateInfo(String name) 
{ 
    textView.setText(name); 


} 

}

kann mir jemand sagen, was das Problem ist, warum ich diese Art von Fehler bekam und welche Änderungen Ich mache in meinem Code. Jeder Vorschlag ist willkommen.

Antwort

0

Der Fehler besagt, dass Ihr onnamesetListener null ist, was bedeutet, dass es nie einen Verweis auf die OnAttach-Methode erhalten hat.

Ich würde vorschlagen, Ihren Catch nicht leer zu lassen, da Sie nicht wissen, ob Ihr Listener beim Anhängen erfolgreich war. Versuchen Sie den folgenden Code, um herauszufinden, warum Ihr Listener null war.

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 

    if (context instanceof OnnamesetListener) { 
      onnamesetListener = (OnnamesetListener) context; 
    } else { 
      throw new RuntimeException(context.toString() 
        + " must implement OnnamesetListener"); 
    } 
} 
+0

Absturz noch Attempt to Interface-Methode ‚Leere com.example.owner.fragcom.fragment_one $ OnnamesetListener.setname (java.lang.String)‘ auf ein Null-Objekt Verweis aufrufen –

+0

Sie wahrscheinlich bewegen Handler wollen außerhalb des Sagens onCreateView, wie zuvor, onActivityCreated (Bundle), das dem Fragment mitteilt, dass seine Aktivität seine eigene Activity.onCreate() abgeschlossen hat. und ich würde den Debugger verwenden und durch den Prozess gehen, um zu sehen, wo Ihr OnnamesetListener Null ist und wann es eine Referenz hat. – Darxval

0

ich Ihre Haupttätigkeit ich nicht sehen kann, wo Sie die fragment_one sind angebracht, wenn es nicht onAttach Verfahren angebracht werden würde, nicht die der Hörer aufgerufen wird, null sein, wenn Sie uns Anbringen sehen lassen.