2017-08-11 5 views
-1

Ich habe eine zweite Aktivität, die alle Benutzereingaben verarbeitet, und eine weitere Aktivität, die alle Daten der zweiten Aktivität verarbeitet. Ich möchte eine Klasse "SubmitName" von der Aktivität zu der zweiten Aktivität aufrufen, so dass ich die Werte von der zweiten Aktivität nicht mehr an die Hauptaktivität übergeben muss. Hier sind die Codes ..Klasse zu einer anderen Aktivität aufrufen

MainActivity (Wo die Klasse "SubmitName" befinden und Werte werden übergeben.)

public class MainActivity extends AppCompatActivity { 
RecyclerView recyclerView; 
TextView Name; 
String lastname; 
String licensenumber; 
String mviolation; 
String maplace; 
String maddress; 
String phonenumber; 
String officername; 
String contactnumber; 
String datetime; 
RecyclerView.LayoutManager layoutManager; 
RecyclerAdapter adapter; 
ArrayList<Violator> arrayList = new ArrayList<>(); 
BroadcastReceiver broadcastReceiver; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 




    Button addBtn = (Button)findViewById(R.id.btnAdd); 

    addBtn.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Intent intent = new Intent(MainActivity.this, FragActivity.class); 
      startActivity(intent); 
     } 
    }); 

    recyclerView = (RecyclerView)findViewById(R.id.recyclerView); 
    Name = (TextView) findViewById(R.id.tvName); 
    Intent intent = getIntent(); 
    String str = intent.getStringExtra("firstname"); 
    lastname = intent.getStringExtra("lastname"); 
    licensenumber = intent.getStringExtra("licensenumber"); 
    mviolation = intent.getStringExtra("violation"); 
    maplace = intent.getStringExtra("arrestplace"); 
    maddress = intent.getStringExtra("address"); 
    phonenumber = intent.getStringExtra("phonenumber"); 
    contactnumber = intent.getStringExtra("contactnumber"); 
    officername = intent.getStringExtra("officername"); 
    datetime = intent.getStringExtra("datetime"); 
    Name.setText(str); 
    layoutManager = new LinearLayoutManager(this); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.setHasFixedSize(true); 
    adapter = new RecyclerAdapter(arrayList); 
    recyclerView.setAdapter(adapter); 
    readFromLocalStorage(); 
    broadcastReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      readFromLocalStorage(); 

     } 
    }; 
} 




@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.nav_bar, menu); 
    return super.onCreateOptionsMenu(menu); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()){ 
     case R.id.TrafficAd: 
      Intent i = new Intent(this, TrafficAdvisory.class); 
      this.startActivity(i); 
      break; 
    } 
    return super.onOptionsItemSelected(item); 
} 

public void submitName(View view) 
{ 

    String name = Name.getText().toString(); 
    String lname = lastname; 
    String lnumber = licensenumber; 
    String violation = mviolation; 
    String aplace = maplace; 
    String address = maddress; 
    String pnumber = phonenumber; 
    String cnumber = contactnumber; 
    String oname = officername; 
    String dtime = datetime; 
    saveToAppServer(name,lname,lnumber,violation,aplace,address,pnumber,cnumber,oname,dtime); 
    Name.setText(""); 
} 

public void readFromLocalStorage() 
{ 
    arrayList.clear(); 
    DbHelper dbHelper = new DbHelper(this); 
    SQLiteDatabase database = dbHelper.getReadableDatabase(); 

    Cursor cursor = dbHelper.readFromLocalDatabase(database); 

    while (cursor.moveToNext()) 
    { 
     String name = cursor.getString(cursor.getColumnIndex(DBContract.NAME)); 
     String lname = cursor.getString(cursor.getColumnIndex(DBContract.LNAME)); 
     String lnumber = cursor.getString(cursor.getColumnIndex(DBContract.LNUMBER)); 
     String violation = cursor.getString(cursor.getColumnIndex(DBContract.VIOLATION)); 
     String aplace = cursor.getString(cursor.getColumnIndex(DBContract.ARRESTPLACE)); 
     String address = cursor.getString(cursor.getColumnIndex(DBContract.ADDRESS)); 
     String pnumber = cursor.getString(cursor.getColumnIndex(DBContract.PNUMBER)); 
     String cnumber = cursor.getString(cursor.getColumnIndex(DBContract.CNUMBER)); 
     String oname = cursor.getString(cursor.getColumnIndex(DBContract.ONAME)); 
     String dtime = cursor.getString(cursor.getColumnIndex(DBContract.DTIME)); 
     int sync_status = cursor.getInt(cursor.getColumnIndex(DBContract.SYNC_STATUS)); 
     arrayList.add(new Violator(name,lname,lnumber,violation,aplace,address,pnumber,cnumber,oname,dtime,sync_status)); 


    } 

    adapter.notifyDataSetChanged(); 
    cursor.close(); 


} 

public void saveToAppServer(final String name,final String lname, final String lnumber,final String violation, final String aplace,final String address, final String pnumber, final String cnumber, final String oname, final String dtime) 
{ 


    if (checkNetworkConnection()) 
    { 
     StringRequest stringRequest = new StringRequest(Request.Method.POST,DBContract.SERVER_URL, 
       new Response.Listener<String>(){ 
        @Override 
        public void onResponse(String response){ 
         try { 
          JSONObject jsonObject = new JSONObject(response); 
          String Response = jsonObject.getString("response"); 
          if(Response.equals("OK")) 
          { 
           saveToLocalStorage(name,lname,lnumber,violation,aplace,address,pnumber,cnumber,oname,dtime,DBContract.SYNC_STATUS_OK); 
          } 
          else 
          { 
           saveToLocalStorage(name,lname,lnumber,violation,aplace,address,pnumber,cnumber,oname,dtime,DBContract.SYNC_STATUS_FAILED); 
          } 

         } catch (JSONException e){ 
          e.printStackTrace(); 
         } 
        } 
       },new Response.ErrorListener(){ 
      @Override 
      public void onErrorResponse(VolleyError error){ 

       saveToLocalStorage(name,lname,lnumber,violation,aplace,address,pnumber,cnumber,oname,dtime,DBContract.SYNC_STATUS_FAILED); 
      } 
     }) 
     { 
      @Override 
      protected Map<String, String> getParams() throws AuthFailureError { 
       Map<String,String> params = new HashMap<>(); 
       params.put("name",name); 
       params.put("lname",lname); 
       params.put("lnumber",lnumber); 
       params.put("violation", violation); 
       params.put("aplace", aplace); 
       params.put("address",address); 
       params.put("pnumber",pnumber); 
       params.put("cnumber",cnumber); 
       params.put("oname",oname); 
       params.put("dtime",dtime); 
       return params; 
      } 
     } 
       ; 
       MySingleton.getInstance(MainActivity.this).addToRequestQue(stringRequest); 
    } 
    else 
    { 
     saveToLocalStorage(name,lname,lnumber,violation,aplace,address,pnumber,cnumber,oname,dtime,DBContract.SYNC_STATUS_FAILED); 
    } 


} 

SecondActivity (Wo Eingaben behandelt werden und Daten an die mainactivity vorbei)

public class ViolatorDetail extends AppCompatActivity implements View.OnClickListener{ 

EditText Name; 
Button btnClose; 
TextView DTime; 



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



    DTime = (TextView)findViewById(R.id.tvDTime); 
    final String currentDT = DateFormat.getDateTimeInstance().format(new Date()); 
    DTime.setText(currentDT); 

    btnClose = (Button) findViewById(R.id.btnClose); 
    btnClose.setOnClickListener(this); 

    Button btnSubmit = (Button)findViewById(R.id.btnSubmit); 
    btnSubmit.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      EditText Name = (EditText)findViewById(R.id.etfName); 
      EditText LName = (EditText)findViewById(R.id.etlName); 
      EditText LNumber = (EditText)findViewById(R.id.etlNumber); 
      EditText Violation = (EditText)findViewById(R.id.etViolation); 
      EditText Arrestplace = (EditText)findViewById(R.id.etaPlace); 
      EditText Address = (EditText)findViewById(R.id.etAddress); 
      EditText PNumber = (EditText)findViewById(R.id.etpNumber); 
      EditText CNumber = (EditText)findViewById(R.id.etcNumber); 
      EditText OName = (EditText)findViewById(R.id.etoName); 
      String DT = DTime.getText().toString(); 
      Intent intent = new Intent(ViolatorDetail.this, MainActivity.class); 
      intent.putExtra("firstname", Name.getText().toString()); 
      intent.putExtra("lastname", LName.getText().toString()); 
      intent.putExtra("licensenumber", LNumber.getText().toString()); 
      intent.putExtra("violation", Violation.getText().toString()); 
      intent.putExtra("arrestplace", Arrestplace.getText().toString()); 
      intent.putExtra("address", Address.getText().toString()); 
      intent.putExtra("phonenumber", PNumber.getText().toString()); 
      intent.putExtra("contactnumber", CNumber.getText().toString()); 
      intent.putExtra("officername", OName.getText().toString()); 
      intent.putExtra("datetime", DT); 
      startActivity(intent); 
     } 
    }); 





} 

}

Was ich will, das „SUBMITNAME“ Klasse in die zweite Aktivität rufen zu tun, so dass keine Daten Gang mehr getan werden.

+0

Was versuchst du hier zu vermeiden? –

+0

Das ist eine Menge Code. Erwägen Sie stattdessen, ein [minimales, vollständiges und überprüfbares Beispiel] (http://stackoverflow.com/help/mcve) zu erstellen. –

+0

der "Intent" ist eine korrekte Möglichkeit, von einer Aktivität zu einer anderen zu wechseln. Die meisten "klassischen" Java-Wege sind nicht garantiert, Objekt kann ausgetauscht werden usw. ... –

Antwort

0

Wie andere Freunde erwähnten Intent ist eine korrekte und gute Möglichkeit, Daten zwischen Aktivitäten zu übertragen. Aber wenn Sie vermeiden wollen, so viel Code zu schreiben, um Daten zu übertragen, schlage ich vor, eine reine Java-Klasse (oder Java-Bean) zu erstellen und alle benötigten Felder in dieser Klasse zu definieren (Hinweis: Diese Klasse sollte java.io.Serializable implementieren). Jetzt könnten Sie Instanzen dieser Klasse zwischen Aktivitäten übertragen.

0

Ich glaube nicht, dass es eine bessere Möglichkeit gibt, Daten zwischen Aktivitäten zu übertragen als Intents. Was Sie wahrscheinlich brauchen, ist Verkapselung der Weitergabe von Extra. Sie können dies erreichen, indem Sie in der ViolatorDetail-Klasse eine statische Methode erstellen, die Argumente als Werte akzeptiert, die Sie übergeben möchten, und Intent zurückgibt.

public static Intent newIntent(Context packageContext, String ... args){ 

    Intent intent = new Intent(packageContext, ViolatorDetail.this); 
    intent.putExtra(EXTRA_STRING_ARGS, args); 
    return intent; 

} 

Dann in der Anrufer Klasse Sie eine Absicht machen, indem Sie auf diese Funktion einen statischen Aufruf makeing, und übergeben Sie Werte als Argumente

Intent intent = ViolatorDetail.newIntent(getActivity(), strings) 
startActivity(intent); 

aber in Ihrem Fall, sollten Sie vielleicht eine vernünftigere machen Art der Datenübergabe als Array von Strings.

+0

Gibt es eine Möglichkeit, Daten direkt aus der ViolatorDetail.class in die recyclerview einzugeben? Damit der Recyclerview von MainActivity nur seinen Inhalt anzeigt. Ohne die Speicherung in der Recycler-Ansicht von MainActivity zu machen? – randolfrojo11

+0

Die einzige Art, wie ich dich sehe, könnte erreichen, was du verlangst, indem du in einer Aktivität alles verteilst und Ansichten versteckst und zeigst. Aber es ist eine schlechte prectice, und ich würde davon abraten. Oft erweist sich eine einfachere Lösung auf lange Sicht als komplizierter. Es ist also nicht die Frage von "kann ich", sondern "sollte ich" ... – Gotiasits

0

Wenn Sie nicht Daten zwischen Aktivitäten mit Intent übergeben möchten, können Sie es tun, indem Sie bestimmte Daten in einem file schreiben und wenn Sie es gerade lesen müssen ... Ich tat es so und ich bin immer noch glücklich, ich habe es so gemacht, es ist einfach und relativ schnell, Sie müssen nur ein wenig über IOExceptions kümmern.

Verwandte Themen