2017-03-11 8 views
0

コードは、https://github.com/hastarin/android-udpsenderから頻繁に借りています。コードが非常に多用途であるため、私はガレージドアのロックを解除するArduinoにUDPパケットを送信する簡単な方法が必要です。アクティビティ間で変数を共有する際の問題

基本的に1ページ目(MainActivity)に大きな「開く」ボタンと小さな「パラメータを設定」ボタンがあります。ページ2(Main2Activity)は主にロットが削除された借用コードであり、IPアドレス、ポート、ロック解除コードワードを入力する方法を提供します。現在、組み立てられたudpパケットをクライアントに送信する「送信」ボタンがあり、意図したとおりに動作します。

問題は、実際には2ページ目に定期的にアクセスしたくないということです。 MainActivityの "sendData"ルーチンが、処理のために格納された値にアクセスする必要があります。私は、変数の値は、そのページ上のsendDataルーチンには利用できないことを意味すると取る

java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference 
    at com.kke.android.opener.MainActivity.sendData(MainActivity.java:47) 
    at com.kke.android.opener.MainActivity.onClick(MainActivity.java:30) 

:中MainActivityページの結果に送信ボタンを押すと、このとき

、。

MainActivity

package com.kke.android.opener; 

import android.content.Context; 
import android.content.Intent; 
import android.net.Uri; 
import android.os.Bundle; 
import android.app.Activity; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 

public class MainActivity extends Activity implements View.OnClickListener{ 

private View view; 

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

    Button btnsend = (Button) findViewById(R.id.buttonSend); 
    Button btnset = (Button) findViewById(R.id.buttonSet); 
    btnsend.setOnClickListener(this); 
    btnset.setOnClickListener(this); 
} 
@Override 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.buttonSend: 
      sendData(v); 
      break; 

     case R.id.buttonSet: 
      editParams(view); 
      break; 
    } 
} 


public void sendData(View view) { 
    Context context = getApplicationContext(); 

    /**Load global variable from Main2Activity*/ 

    Bundle bundle = getIntent().getExtras(); 
    String host = bundle.getString("host"); 
    String port = bundle.getString("port"); 
    String dataText = bundle.getString("dataText"); 

    //EditText editText = (EditText) findViewById(R.id.editTextIP); 
    //String host = editText.getText().toString(); 
    if (!host.matches("\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b")) { 
     CharSequence text = "Error: Invalid IP Address"; 
     Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT); 
     toast.show(); 
     return; 
    } 
    //editText = (EditText) findViewById(R.id.editTextPort); 
    //String port = editText.getText().toString(); 
    if (!port.matches("^(6553[0-5]|655[0-2]\\d|65[0-4]\\d\\d|6[0-4]\\d{3}|[1-5]\\d{4}|[1-9]\\d{0,3}|0)$")) { 
     CharSequence text = "Error: Invalid Port Number"; 
     Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT); 
     toast.show(); 
     return; 
    } 
    // editText = (EditText) findViewById(R.id.editTextData); 
    //String dataText = editText.getText().toString(); 
    if (dataText.length() < 1) { 
     CharSequence text = "Error: Text required to send"; 
     Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT); 
     toast.show(); 
     return; 
    } 
    String uriString = "udp://" + host + ":" + port + "/"; 
    uriString += Uri.encode(dataText); 

    Uri uri = Uri.parse(uriString); 
    Intent intent = new Intent(Intent.ACTION_SENDTO, uri); 
    intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); 
    intent.addCategory(Intent.CATEGORY_DEFAULT); 

    startActivity(intent); 
} 

    /** Called when the user taps the Set Params button */ 

    public void editParams(View view) { 
     Intent intent = new Intent(this, Main2Activity.class); 
     startActivity(intent); 
    } 

} 

Main2Activity

package com.kke.android.opener.ui; 

import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.net.Uri; 
import android.os.Bundle; 
import android.text.InputType; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.EditText; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.widget.ToggleButton; 

import com.kke.android.opener.R; 

public class Main2Activity extends Activity { 

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

    // Restore preferences 
    SharedPreferences settings = getPreferences(0); 
    ToggleButton toggleButton = ((ToggleButton) findViewById(R.id.toggleButton)); 
    boolean checked = settings.getBoolean("toggleChecked", false); 
    toggleButton.setChecked(checked); 
    toggleButton.setVisibility(View.GONE); 
    EditText editText = (EditText) findViewById(R.id.editTextIP); 
    if (checked) { 
     editText.setInputType(InputType.TYPE_CLASS_TEXT); 
    } 
    editText.setText(settings.getString("host", ""), TextView.BufferType.EDITABLE); 
    editText = (EditText) findViewById(R.id.editTextPort); 
    if (checked) { 
     editText.setInputType(InputType.TYPE_CLASS_TEXT); 
    } 
    editText.setText(settings.getString("port", ""), TextView.BufferType.EDITABLE); 
    editText = (EditText) findViewById(R.id.editTextData); 
    editText.setText(settings.getString("dataText", ""), TextView.BufferType.EDITABLE); 

    /** Set up global variable to pass to MainActivity */ 

    Intent intent = new Intent(Main2Activity.this, MainActivity.class); 
    intent.putExtra("host", "host"); 
    intent.putExtra("port", "port"); 
    intent.putExtra("dataText", "dataText"); 
    startActivity(intent); 

} 

@Override 
public void onPause() { 
    super.onPause(); 

    // Get current values 
    EditText editText = (EditText) findViewById(R.id.editTextIP); 
    String host = editText.getText().toString(); 
    editText = (EditText) findViewById(R.id.editTextPort); 
    String port = editText.getText().toString(); 
    editText = (EditText) findViewById(R.id.editTextData); 
    String dataText = editText.getText().toString(); 



    // We need an Editor object to make preference changes. 
    // All objects are from android.context.Context 
    SharedPreferences settings = getPreferences(0); 
    SharedPreferences.Editor editor = settings.edit(); 
    editor.putString("host", host); 
    editor.putString("port", port); 
    editor.putString("dataText", dataText); 
    editor.putBoolean("toggleChecked", ((ToggleButton) findViewById(R.id.toggleButton)).isChecked()); 

    // Commit the edits! 
    editor.commit(); 
} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle item selection 
    switch (item.getItemId()) { 
     case R.id.action_send: 
      this.sendData(null); 
      return true; 
     default: 
      return super.onOptionsItemSelected(item); 
    } 
} 

public void sendData(View view) { 
    Context context = getApplicationContext(); 

    EditText editText = (EditText) findViewById(R.id.editTextIP); 
    String host = editText.getText().toString(); 
    if (!host.matches("\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b")) { 
     CharSequence text = "Error: Invalid IP Address"; 
     Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT); 
     toast.show(); 
     return; 
    } 
    editText = (EditText) findViewById(R.id.editTextPort); 
    String port = editText.getText().toString(); 
    if (!port.matches("^(6553[0-5]|655[0-2]\\d|65[0-4]\\d\\d|6[0-4]\\d{3}|[1-5]\\d{4}|[1-9]\\d{0,3}|0)$")) { 
     CharSequence text = "Error: Invalid Port Number"; 
     Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT); 
     toast.show(); 
     return; 
    } 
    editText = (EditText) findViewById(R.id.editTextData); 
    String dataText = editText.getText().toString(); 
    if (dataText.length() < 1) { 
     CharSequence text = "Error: Text/Hex required to send"; 
     Toast toast = Toast.makeText(context, text, Toast.LENGTH_SHORT); 
     toast.show(); 
     return; 
    } 
    String uriString = "udp://" + host + ":" + port + "/"; 
    uriString += Uri.encode(dataText); 

    Uri uri = Uri.parse(uriString); 
    Intent intent = new Intent(Intent.ACTION_SENDTO, uri); 
    intent.addFlags(Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP); 
    intent.addCategory(Intent.CATEGORY_DEFAULT); 

    startActivity(intent); 
} 

public void onToggleClicked(View view) { 
    boolean on = ((ToggleButton) view).isChecked(); 


    EditText editTextIp = (EditText) findViewById(R.id.editTextIP); 
    EditText editTextPort = (EditText) findViewById(R.id.editTextPort); 
    if (on) { 
     editTextIp.setInputType(InputType.TYPE_CLASS_TEXT); 
     editTextPort.setInputType(InputType.TYPE_CLASS_TEXT); 
    } else { 
     editTextIp.setInputType(InputType.TYPE_CLASS_PHONE); 
     editTextPort.setInputType(InputType.TYPE_CLASS_PHONE); 
    } 
} 
} 

すべての提案が理解されるであろう。 私はこれについて非常に新しいことを覚えておいてください。 (その活動はまだ始まったばかり)を取得するには何のエキストラがなかったとき

+1

あなたには深刻な設計上の問題があるようです。1。どちらのアクティビティも同じレイアウトです。 Activityクラスを1つしか持たず、複数のインスタンスを作成できるので、これは完全に冗長です。 2.活動間のデータの流れが奇妙に見える。 'MainActivity'はLauncherと' Main2Activity'の両方から起動できるので、特にそうです。一歩前に戻り、さらに進める前にアプリの流れを把握する必要があります。 –

答えて

1

あなたの活動の両方がまったく同じレイアウトを持っている...それはおそらく混乱しています...

はとにかく、あなたはgetIntent().getExtras()と呼ばれます。あなたは、単に意図はまだ可能性があるため、あなたが何かを得ることはありませんならば、これは

Bundle extras = getIntent().getExtras(); 
// TODO: declare some variables here 
String host, port, text; 
if (extras != null) { 
    // TODO: assign your variables here 
    String host = extras.getString("host"); 
    String port = extras.getString("port"); 
    String dataText = extras.getString("dataText"); 
} 

しかし、驚くことはありません行うことができますあなたのコードの

サンプル

Bundle bundle = getIntent().getExtras(); 
    String host = bundle.getString("host"); 
    String port = bundle.getString("port"); 
    String dataText = bundle.getString("dataText"); 

空である

+0

設定が既にある場合は、2番目のアクティビティにアクセスしたくないので、まだ空になっていると思います。元の著者は、テキストビューを照会してURI文字列を処理します。私は値がどのように持続され、どのようにそれらを主要なアクティビティに読み込むかを理解しているように見えません。 – kkrofft

+0

'intent.setExtra()'と 'startActivity(intent)'の後に 'getIntent()。getExtras()'をこの順に呼び出します。 [mcve]で把握するのは難しいことではありません。しかし、多くのコードを持っているので、基本的なコードを削除してください。 –

1

あなたのMainActivityはおそらくtから起動されます彼はAndroidランチャーであり、MainActivity2からのものではありません。

送信をクリックすると、ここにあなたを連れてきた意図が検査されます(このアクティビティに表示されます)。あなたがランチャーから来たので、このインテントには、関数を実行するために必要なデータがありません。あなたのMainActivity2でこのインテントのデータを設定していることを覚えておいてください(この文脈では悪い習慣です)。

<activity android:name="<YOUR_ACTIVITY_TWO_NAME"> 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 

     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 

これはあなたのActivity2が、これはMainActivityにリンクし、実際のデータとの意図を送信し、最初に呼び出されることを確認します:マニフェストに移動して、あなたのMainActivity2あなたのランチャー活動にし、これを修正するには

+0

私はあなたが何を得ているのかを理解しています。私はその活動が処理に使用されなければならないと思っていたが、それがどのように関係しているかについては必ずしも確かではなかった。私は最初に来る新しい主要な活動のスクリーンを作る方法を働くことの良いビットを費やしました。 – kkrofft

+0

インテントフィルタを追加するだけでそれを修正する必要があります。 –

+0

あなたは何を意味するのか分かりません。現在のところ:<アクティビティ android:name = "com.kke.android.opener.MainActivity" android:label = "@ string/app_name"> <インテントフィルタ> <アクションandroid:name = "アンドロイドです。 intent.action.MAIN "/> <カテゴリandroid:name =" android.intent.category.LAUNCHER "/> kkrofft

関連する問題