2016-01-06 70 views
2

我目前工作的一個應用程序,允許你做的筆記列表:從第二活動的第一個發送數據不起作用的Android

  • 名單中的第一個活動
  • 可見
  • 新的筆記按鈕導致與編輯文本和幾個文本格式按鈕(粗體,斜體,更大的文字,更小)的第二個活動
  • 該應用程序允許您長時間點擊編輯或刪除列表中的筆記。

問題是,當我從一個活動的數據發送到另一個我得到這個錯誤的日誌:

顯示java.lang.NullPointerException:試圖調用虛擬方法 「java.lang.String中java.lang.Object.toString()」上一個空對象 參考

,當我嘗試將數據發送回第一個活動只會發生。當我嘗試從第二個活動中的按鈕內部保存時,採用相同的方法:

getText().toString() 

工作得很好。以下是在活動和保存方法之間發送/接收數據的代碼。

public void sendMessage(View view) 
{ 
    editText = (EditText) findViewById(R.id.add_text); 
    String message = editText.getText().toString(); 
    Intent intent = new Intent(this, MainActivity.class); 
    intent.putExtra(key_Message, message); 
    startActivity(intent); 
} 


@Override 
protected void onResume() { 
    super.onResume(); 
    Intent intent = getIntent(); 
    String message = intent.getStringExtra(key_Message); 
    list.add(message); 
    adapter.notifyDataSetChanged(); 
} 

這裏是保存文本內部(工作正常)的方法。請注意,我在的WriteMessage添加SendMessage函數(但評論它)

public void writeMessage(View view) 
{ 
    String Message = editText.getText().toString(); 
    String file_name = "Notes_file"; 
    try { 
     FileOutputStream fileOutputStream = openFileOutput(file_name, MODE_PRIVATE); 
     fileOutputStream.write(Message.getBytes()); 
     fileOutputStream.close(); 
     Toast.makeText(getApplicationContext(),"Message has been saved", Toast.LENGTH_SHORT).show(); 
     //String message = editText.getText().toString(); 
     //Intent intent = new Intent(this, MainActivity.class); 
     //intent.putExtra(key_Message, message); 
     //startActivity(intent); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

也是另一個小問題我不能換我的頭周圍之一:

public void shrinkText(View view) 
{ float modifySize = editText.getTextSize(); 
    modifySize = modifySize - 3; 
    editText.setTextSize(modifySize); 
} 

是認爲小法在用戶單擊按鈕時從編輯文本中縮小文本。它總是增加文字。一些幫助將不勝感激。

public void writeMessage(View view) 
{ 
    String Message = editText.getText().toString(); 
    String file_name = "Notes_file"; 
    try { 
     FileOutputStream fileOutputStream = openFileOutput(file_name, MODE_PRIVATE); 
     fileOutputStream.write(Message.getBytes()); 
     fileOutputStream.close(); 
     Toast.makeText(getApplicationContext(), "Message has been saved", Toast.LENGTH_SHORT).show(); 
     String message = editText.getText().toString(); 
     Intent intent = new Intent(); 
     intent.putExtra(key_edit, message); 
     setResult(RESULT_OK, intent); 
     finish(); 


    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if(requestCode == 1){ 
     if(resultCode == RESULT_OK){ 
      String item_tobeadded1; 
      item_tobeadded1 = data.getStringExtra(key_edit); 
      list.add(item_tobeadded1); 
      //adapter.notifyDataSetChanged(); 
      adapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1, list); 
      list_view.setAdapter(adapter); 
     } 
    } 
} 
+5

http://stackoverflow.com/a/14292451/2435402這是一個偉大的答案幫助你實現你的邏輯。 – ElliotM

+0

現在發送作品,但是當我將特定項目添加到列表視圖時,它不會出現。 – user3402719

+0

調用你的列表視圖的適配器,並在發送對象時調用notifyDataSetChanged –

回答

0

正如已經建議你可以做的是開始你的第二個活動與您,當您編輯只是點擊listview項目,或當你箱子一個新的沒有通過任何數據。

通過這種方式,您可以編輯以及創建新的Note,而無需對代碼進行太多更改。

int RESPONSE_CODE = 123; // from this code will will differentiate if 
         // the activity which we started actually did the task or not 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

      Intent intent = new Intent(getApplicationContext(), NoteEditActivity.class); 
      intent.putString("para1","arg1"); 
      intent.putString("para2","arg2"); 
      intent.putString("para3","arg3"); 
      intent.putString("para4","arg4"); 
      startActivityForResult(intent, RESPONSE_CODE); 
     } 
    }); 

in NoteEditActivity.class如果有東西,您可以收到您的參數。同時創建新的Note Note,para2,para3 & para4將爲空。但是,如果注意已經存在,你將不得不編輯

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    Intent myIntent = getIntent(); 
    String arg1 = myIntent.getStringExtra("para1"); 
    String arg2 = myIntent.getStringExtra("para2"); 
    String arg3 = myIntent.getStringExtra("para3"); 
    String arg4 = myIntent.getStringExtra("para4"); 
    // here you have to check that they or not null to differentiate 
    // if it is a new Note to be created OR you have to edit. 
    // you should probably use some another way to figure this out, i am writing this because i would not be using it :) 

} 

一旦您完成創建或編輯你的注意,相關數據附加到的意圖和完成活動這樣

Intent intent = new Intent(); 
intent.putExtra("para1","edited_data_1"); 
intent.putExtra("para2","edited_data_2"); 
intent.putExtra("para3","edited_data_3"); 
intent.putExtra("para4","edited_data_4"); 
setResult(RESULT_OK, intent);   
finish(); 

如果任務成功,您將設置結果RESULT_OK連接的意圖和你在以前做過的事情

你必須覆蓋一個名爲onActivityResult()這種方法從活動喲接收數據的方法ü已經開始做一些任務,

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == 1) { 
     if(resultCode == RESULT_OK){ 

      String arg1 = data.getStringExtra("para1"); 
      String arg2 = data.getStringExtra("para2"); 
      String arg3 = data.getStringExtra("para3"); 
      String arg4 = data.getStringExtra("para4"); 
      // if you receive the data here, 
      // you can add another element to List from which the - 
      //`ListView` is populated and call `notifyDataSetChanged()` on the adapter. 
      // like this `adapter.notifyDataSetChanged();` it will update the `listview` - 
      //with new data that you received from the `NoteEditActivity.class` 

      adapter.notifyDataSetChanged(); // I am assuming you would add the changed item to the List 
     }  
    } 
} 

更新,我創建了一個虛擬的代碼爲你和它的作品,我已經測試過它,我還上傳了它在Github上,你可以檢查它有

NoteListActivity.java

public class NoteListActivity extends Activity { 

    private ListView listView; 
    private ArrayList<String> strings; 
    public static final String NEW_ELEMENT = "NEW_ELEMENT"; 
    public static final String ELEMENT_VALUE = "ELEMENT_VALUE"; 
    public static final String ELEMENT_POSITION = "ELEMENT_POSITION"; 
    private ArrayAdapter<String> adapter; 

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

     listView = (ListView) findViewById(R.id.NoteListActivity_listView); 
     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       String text = (String) listView.getItemAtPosition(position); 
       Intent intent = new Intent(getApplicationContext(), NoteEditActivity.class); 
       intent.putExtra(NEW_ELEMENT, false); 
       intent.putExtra(ELEMENT_POSITION, position); 
       intent.putExtra(ELEMENT_VALUE, text); 
       startActivityForResult(intent, 123); 
      } 
     }); 

     FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.NoteListActivity_fab); 
     fab.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       Intent intent = new Intent(getApplicationContext(), NoteEditActivity.class); 
       intent.putExtra(NEW_ELEMENT, true); 
       startActivityForResult(intent, 123); 
      } 
     }); 

     setUpList(); 

     adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.simple_list_item_1, strings); 
     listView.setAdapter(adapter); 
    } 

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     super.onActivityResult(requestCode, resultCode, data); 
     Log.d("NoteListActivity1",""+data.getStringExtra(NoteListActivity.ELEMENT_VALUE)); 

     if (requestCode == 123) { 
      if (resultCode == RESULT_OK) { 
       Log.d("NoteListActivity2",""+data.getStringExtra(NoteListActivity.ELEMENT_VALUE)); 
       boolean isNewElement = data.getBooleanExtra(NoteListActivity.NEW_ELEMENT, false); 
       if (isNewElement) { 
        strings.add("" + data.getStringExtra(NoteListActivity.ELEMENT_VALUE)); 
        adapter.notifyDataSetChanged(); 
       } else { 
        strings.set(data.getIntExtra(NoteListActivity.ELEMENT_POSITION, 0), "" + data.getStringExtra(NoteListActivity.ELEMENT_VALUE)); 
        adapter.notifyDataSetChanged(); 
       } 
      } 
     } 
    } 

    private void setUpList() { 
     strings = new ArrayList<>(); 
     for (int i = 0; i < 4; i++) { 
      strings.add("Element_1_" + i); 
     } 
    } 
} 

activity_note_list.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true" 
    tools:context="com.nimgade.pk.mytutorialapplication.MainActivity"> 

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
     xmlns:tools="http://schemas.android.com/tools" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     tools:context="activities.list.first.NoteListActivity"> 


     <ListView 
      android:id="@+id/NoteListActivity_listView" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 
    </LinearLayout> 

    <android.support.design.widget.FloatingActionButton 
     android:id="@+id/NoteListActivity_fab" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="bottom|end" 
     android:layout_margin="@dimen/fab_margin" 
     android:src="@android:drawable/ic_menu_add" /> 

</android.support.design.widget.CoordinatorLayout> 

NoteEditActivity.java

public class NoteEditActivity extends Activity { 

    private EditText editText; 
    private Button button; 
    private boolean isNewElement; 
    private int position; 

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

     editText = (EditText) findViewById(R.id.NoteEditActivity_editText); 
     button = (Button) findViewById(R.id.NoteEditActivity_button); 

     Intent myIntent = getIntent(); 
     isNewElement = myIntent.getBooleanExtra(NoteListActivity.NEW_ELEMENT, false); 

     if (!isNewElement) { 
      editText.setText("" + myIntent.getStringExtra(NoteListActivity.ELEMENT_VALUE)); 
      position = myIntent.getIntExtra(NoteListActivity.ELEMENT_POSITION,0); 
     } 

     button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       String text = editText.getText().toString(); 
       if (text != null && text.trim().length() > 0) { 
        Intent intent = new Intent(); 
        Log.d("NoteEditActivity",""+text); 
        intent.putExtra(NoteListActivity.ELEMENT_VALUE, text); 
        intent.putExtra(NoteListActivity.NEW_ELEMENT, isNewElement); 
        if (!isNewElement) { 
         intent.putExtra(NoteListActivity.ELEMENT_POSITION, position); 
        } 
        setResult(RESULT_OK, intent); 
        finish(); 
       } else { 
        Toast.makeText(getApplicationContext(), "Kindly write a valid element name", Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }); 
    } 
} 

activity_note_edit.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="match_parent" 
    android:layout_height="match_parent" 
    android:gravity="center" 
    android:orientation="vertical" 
    tools:context="activities.list.first.NoteEditActivity"> 


    <EditText 
     android:id="@+id/NoteEditActivity_editText" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <Button 
     android:id="@+id/NoteEditActivity_button" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Save" 
     android:textAllCaps="false" /> 
</LinearLayout> 
+0

它的工作..但仍然不會將項目添加到列表中,我使用list.add(item)和adapter.notifyDataSetChanged(); – user3402719

+0

@ user3402719 ok,在這種情況下,重新啓動適配器後,將項目添加到列表中,並將此適配器設置爲列表視圖 –

+0

仍然沒有...我添加項目,然後重新啓動適配器並重新設置它用於列表 – user3402719

相關問題