2017-11-22 5 views
0

In onAttach() Methode Communicator = (Communicator) Aktivität gibt null zurück. Wenn ich auf die Image View klicke, zeigt es den Wert communicatior ist null. Ich habe überprüfen, aber nicht in der Lage, das Problem zu lösen. Hier im Fragment beim Klicken auf die Bildansicht sollten einige Daten in die Aktivität übernommen werden. Aber die Bezugsgröße der Schnittstelle Commnunicator Communicator erhält den Nullwert in onAttch()Schnittstelle innerhalb des Fragments gibt Nullwert zurück

public class SendFragment extends Fragment { 
ImageView imgContact; 
TextView tvContactName; 
String username; 
Communicator communicator; 

public interface Communicator { 
    public void sendDataToActivity(String s); 
} 

public static final String TAG = SendFragment.class.getSimpleName(); 


@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    if (context instanceof Communicator) { 
     communicator = (Communicator) context; 
    } else { 
     throw new IllegalArgumentException(
       "Must implement " + TAG + ".Communicator on caller Activity"); 
    } 
} 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

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

    View view = inflater.inflate(R.layout.fragment_send, container, false); 
    imgContact = (ImageView) view.findViewById(R.id.contactbook); 
    tvContactName = (TextView) view.findViewById(R.id.tvcontactname); 

    if(!TextUtils.isEmpty(username)) { 
     username = getArguments().getString("username").toString(); 
     tvContactName.setText(username); 
    } 

    listeners(); 

    return view; 
} 


private void listeners() { 
    imgContact.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      communicator.sendDataToActivity(Constants.selectUserName); 
      Intent intent = new Intent(getActivity(), AllContactsListActivity.class); 
      startActivity(intent); 

     } 
    }); 
} 

}

Nun ist die unten ist mein Code der Aktivität ..

public class AllContactsListActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener, SendFragment.Communicator,RecyclerViewAdapter.OnItemClick { 
Context context; 
RecyclerView recyclerView; 
RecyclerView.Adapter recyclerViewAdapter; 
RecyclerView.LayoutManager recylerViewLayoutManager; 
ImageButton btnSliding_common; 

DrawerLayout drawer; 
NavigationView navigationView; 
String sendFragmentStringFlag; 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    setContentView(R.layout.activity_all_contacts_list); 
    setIds(); 
    listeners(); 


} 



private void listeners() { 

    recyclerViewAdapter = new RecyclerViewAdapter(AllContactsListActivity.this, subjects, emails, address,this); 

    recyclerView.setAdapter(recyclerViewAdapter); 

    RecyclerView.ItemDecoration itemDecoration = 
      new DividerItemDecoration(this, LinearLayoutManager.VERTICAL); 
    recyclerView.addItemDecoration(itemDecoration); 



    btnSliding_common.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      drawer.openDrawer(GravityCompat.END); 
     } 
    }); 
} 

private void setIds() { 
    recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
    btnSliding_common = (ImageButton) findViewById(R.id.btnSliding_contact); 
    drawer = (DrawerLayout) findViewById(R.id.drawer_layout_contact); 
    navigationView = (NavigationView) findViewById(R.id.nav_view_contact); 

    recylerViewLayoutManager = new LinearLayoutManager(getApplicationContext()); 

    recyclerView.setLayoutManager(recylerViewLayoutManager); 
} 





@Override 
public void sendDataToActivity(String sendMoneyflag) { 
    sendFragmentStringFlag=sendMoneyflag; 

    } 

@Override 
public void onClick(String username) { 
    if(!TextUtils.isEmpty(sendFragmentStringFlag)) { 
     if (sendFragmentStringFlag.equals(Constants.selectUserName)) { 
      Toast.makeText(this, "You clicked " + username, Toast.LENGTH_SHORT).show(); 
      Bundle bundle = new Bundle(); 
      bundle.putString("username", username); 
      SendFragment sendFragment = new SendFragment(); 
      sendFragment.setArguments(bundle); 
      finish(); 
     } 
    }else{ 
     Toast.makeText(this, "USER NAME" + username, Toast.LENGTH_SHORT).show(); 
    } 
} 

}

Antwort

0

Das Problem wahrscheinlich, weil die Host-Aktivität nicht implementiert wurde die Fragment-Schnittstelle.

Sie versuchen, die Schnittstelle mit dem folgenden Verfahren befestigen:

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 
    try { 
    communicator = (Communicator) activity; 
    } catch (Exception e){} 
} 

Aber Sie nicht die Ausnahme richtig behandeln hat. Sie wissen also nicht, wann die Schnittstelle richtig eingestellt ist. Und Sie überschreiben auch onAttach(Activity activity), die jetzt veraltet ist.

benötigen Sie den Code wie folgt zu ändern:

public static final String TAG = YourFragment.class.getSimpleName(); 
... 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    if (context instanceof Communicator) { 
    communicator = (Communicator) context; 
    } else { 
    throw new IllegalArgumentException(
      "Must implement " + TAG + ".Communicator on caller Activity"); 
    } 
} 

Es Fehler werfen, wenn Ihr Host-Aktivität nicht die Schnittstelle implementieren haben.

Sie müssen das Fragment auch an Ihre Aktivität anfügen, indem Sie FragmentTransaction verwenden. Etwas wie folgt aus:

FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 

SendFragment sendFragment = new SendFragment(); 
fragmentTransaction.add(R.id.fragment_container, sendFragment); 
fragmentTransaction.commit(); 
+0

nach dem Code der Umsetzung wird Ausnahme wie zeigt „java.lang.IllegalArgumentException: Muss SendFragment.Communicator auf Anrufer Aktivität implementieren“ .. –

+0

, dass ein korrektes Verhalten ist. Dies bedeutet, dass Sie die Schnittstelle nicht in Ihrer Host-Aktivität implementiert haben. Ihre Aktivitätsklasse sollte folgendermaßen definiert sein: 'public class YourActivity extends Activity implementiert YouFragment.Communicator {}' –

+0

Ich habe das bereits implementiert. Aber ich bekomme die selbe Ausnahme. ** "öffentliche Klasse AllContactsListActivity erweitert AppCompatActivity implementiert NavigationView.OnNavigationItemSelectedListener, SendFragment.Communicator, RecyclerViewAdapter.OnItemClick **" –

Verwandte Themen