take_rock_5
@take_rock_5 (イ タケ)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Switchを使用して別のActivityのViewの表示/非表示をさせたい

トグルSwitchを使用して、別のActivityのViewの表示/非表示をさせたいと思っておりますが、
私のコードですと、Switchを操作するとアプリが落ちてしまいます。

言い換えますと
activity_Sub.xmlのSwitchでactivity_main.xmlのViewの表示/非表示をさせたい。

(同じActivity上の表示/非表示は問題なくできます。)

恐らくすごく初歩的なことを聞いているのだと思いますが
どこがおかしいか教えて頂きたく宜しくお願いします。

アプリが落ちるときの表示
image.png

該当するソースコード

activity_main.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btNext"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onButtonClick"
        android:text="@string/bt_Next"/>

    <View
        android:id="@+id/view1"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_gravity="center"
        android:layout_x="0dp"
        android:layout_y="0dp"
        android:alpha="0.7"
        android:background="#A1A9BA"/>

</LinearLayout>

MainActivity.java


public class MainActivity extends AppCompatActivity {

    //private View view1;

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

        //view1 = (View) findViewById(R.id.view1);
        //view1.setEnabled(false);
        //view1.setClickable(false);
    }
    // [次の画面を表示]ボタンがタップされたときの処理。
    public void onButtonClick(View view){
        // インテントオブジェクトを用意。
        Intent intent = new Intent(MainActivity.this, SubActivity.class);
        // アクティビティを起動。
        startActivity(intent);
    }
}

activity_Sub.xml


<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/btPrevious"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onButtonClick"
        android:text="@string/bt_previous"/>

    <Switch
        android:id="@+id/switchTouchDisable"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Viewの表示非表示" />

    <View
        android:id="@+id/view2"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:layout_gravity="center"
        android:layout_x="0dp"
        android:layout_y="0dp"
        android:alpha="0.7"
        android:background="#A1A9BA"/>


</LinearLayout>

SubActivity.java

public class SubActivity extends AppCompatActivity {

    private View view1;
    private View view2;

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

        // スイッチのインスタンスを作成
        Switch toggleSwich = findViewById(R.id.switchTouchDisable);
        toggleSwich.setOnCheckedChangeListener(new onCheckedChangeListener());

        view1 = (View) findViewById(R.id.view1);
        view2 = (View) findViewById(R.id.view2);

    }

    // [前の画面を表示]ボタンがタップされたときの処理。
    public void onButtonClick(View view){
        //このアクティビティの終了。
        finish();
    }
    // トグルスイッチをON/OFFのボタンを押した時に処理するクラス。
    public class onCheckedChangeListener implements CompoundButton.OnCheckedChangeListener {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

            if (isChecked) {
                Log.d("SubActivity", "ON");
                view1.setVisibility(View.VISIBLE);
                view2.setVisibility(View.VISIBLE);
            } else {
                Log.d("SubActivity", "OFF");
                view1.setVisibility(View.GONE);
                view2.setVisibility(View.GONE);
            }
        }
    }

}

strings.xml

<resources>
    <string name="app_name">IntentSampleSwitch</string>
    <string name="bt_Next">次の画面を表示</string>
    <string name="bt_previous">前の画面を表示</string>
</resources>
0

1Answer

まず、アプリが不正終了した時のログを Logcat で確認するとよいと思います。
おそらく、推測が正しければ、 NullPointerException が発生しているはずです。

なぜなら、SubActivity で view1 はできないはずです。

view1 = (View) findViewById(R.id.view1);

findViewById は Activity に関連付けられた View(のxml)から指定のIDで参照を得るので
activity_Sub.xml にない R.id.view1 は見つけることができません。

基本的に、他のActivity を直接制御するのはあまり良い手法ではないです。
よくある手法としては、設定として残し、onResume 等で設定情報に合わせて view の状態を変えるパターンでしょう。
設定を残すほどでもないならば、Sub の Activity の結果を受け取って view の状態を変えるのも有効と思います。
(参考) https://developer.android.com/training/basics/intents/result?hl=ja

0Like

Comments

  1. @take_rock_5

    Questioner

    ありがとうございます。
    Logcatも確認する様に致します。確かにNullPointerExceptionも文字ありましたので、 NullPointerExceptionが発生しているものと思われます。
    activity_Sub.xml にない R.id.view1 は見つけることができないのですね。
    頂いた情報を参考に目的の動作をさせてみたいと思います。

Your answer might help someone💌