2016-10-13 2 views
1

問題があります。私は3つのアクティビティ(MainActivity、DetailsActivity、SettingsActivity)を持っており、SettingsActivityにはTogglebutton "Nightmode"があります。私が欲しいのは、ボタンが変更されたときに、3つのアクティビティすべての背景を灰色に変更することです。ボタンで他のアクティビティの背景を変更する

public class SettingsActivity extends AppCompatActivity { 
//This is SettingsActivity(not Main one) 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_settings); 

    TextView SettingsTitle = (TextView) findViewById(R.id.SettingsTitle); 
    TextView NightText = (TextView) findViewById(R.id.NightmodeText); 
    ToggleButton toggleNightMode = (ToggleButton) findViewById(R.id.toggleNightmode); 
    final RelativeLayout NightBG = (RelativeLayout) findViewById(R.id.NightBG); 
    final LinearLayout DetailsBG = (LinearLayout) findViewById(R.id.mainBG); 
    final LinearLayout HomeBG = (LinearLayout) findViewById(R.id.HomeBG); 

    toggleNightMode.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      NightBG.setBackgroundColor(Color.parseColor("#545657")); 
      HomeBG.setBackgroundColor(Color.parseColor("#545657")); 
      DetailsBG.setBackgroundColor(Color.parseColor("#545657")); 

     } 
    }); 

NightBGは、そのJavaファイル(SettingsActivity)と同じアクティビティにあります。しかしHomeBGはMainActivityにあり、DetailsBGはDetailsActivityにあります。私がアプリを起動し、そのボタンを押すたびに、アプリが痛む。このファイルからHomeBGとDetailsBGを削除すると、現在のレイアウトの色をグレーに変更しても問題ありません。私を助けてください。

+0

ホームビューと詳細ビューは設定アクティビティには存在しないようです。私はこれがnightBGオブジェクトのnull参照例外を引き起こしていると思います。私はあなたが他の活動にアクセスする別の方法を見つけなければならないと思います。現時点では、クロスアクティビティ通信を行う方法がわかりません。 –

+0

それは私がええについて考えていることです。問題は、私がJavaでのプログラミングでは初心者だということです。私は何かを見つけて欲しいです:P。とにかくありがとう! :) –

+0

私は現時点でできる最善の答えを提出しましたが、少なくともあなたに別のオプションを与えます。 –

答えて

0

同じアクティビティの現在のアクティビティの背景を変更します。 DetailsActivityは実行されていないので、それを行うことはできません。それはあなたにヌルポインタを与えます。あなたは、3種類のリンゴを食べようとしているのですか?現在のアクティビティが開始されたら、背景を変更します。

更新:

あなたはその現在の活動で、ちょうど現在のアクティビティで行うことができます。

findViewById(android.R.id.content).setBackground(getColor(R.color.your_color)); 

が実行されていない他の活動でこれを呼び出そうとしないでください。

setBackground() 

または

setBackgroundColor() 
+0

ここにコードを記載してください。私はJavaプログラミングの初心者です。 –

+0

大丈夫です。しかし、他の活動の背景色を変更する方法。うーん、道があるはず! –

+1

そのアクティビティが実行されている場合を除き、これを行うことはできません。アクティビティのレイアウトで、必要な色を設定できます。あなたの部屋の色を変えようとするようなものですが、部屋はありません。 –

0

あなたの他の活動が開いている場合は、インテントを使って、他の活動にメッセージを送信する必要があります。

How to send string from one activity to another?

あなたはその後、活動の背景を設定することができ意向を受け

他のアクティビティがまだ開いていない場合は、インテントを送信できません。この場合、現在の背景色を含む可能性がある静的な値をメインアクティビティに参照させることができます。その値を作成関数の他のアクティビティーで参照する必要があります。

ここでは、別のアクティビティから変数を参照する方法の例を示します。

How do I get a variable in another activity?

これは、それを処理するための最もきれいな方法ではないかもしれませんが、それは動作するはずです。

+0

ありがとうございました!私は16時間でこれを試してみる(私は今ベッドに入っている)!それが動作するかどうかを教えてくれます。 –

1

このような小さな設定をボタンのクリック時に開いたりアクティブにしたりしない複数のアクティビティに簡単に保存するには、SharedPreferencesを使用します。

このようなシンプルなコードの場合、ちょっと残酷かもしれませんが、他に見つからない場合はいつでも試してみることができます。

あなたのコードは次のようなものになります:

toggleNightMode.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     // Set the color of this activity 
     int color = Color.parseColor("#545657") 
     View view = SettingsActivity.this.getWindow().getDecorView(); 
     view.setBackgroundColor(color); 
     // Save color preference 
     SharedPreferences sharedPref = SettingsActivity.this.getSharedPreferences("bgColorFile",Context.MODE_PRIVATE); 
     SharedPreferences.Editor editor = sharedPref.edit(); 
     editor.putInt("color", color); 
     editor.apply();  
    } 
}); 

をそして、あなたはあなたの活動を開いたとき、あなたは(ONSTARTにこのような何かを置く)、またはあなたの活動ののonCreate()メソッド:

// Get the color preference 
SharedPreferences sharedPref = getSharedPreferences("bgColorFile",Context.MODE_PRIVATE); 
int colorValue = sharedPref.getInt("color", 0); 
View view = this.getWindow().getDecorView(); 
view.setBackgroundColor(colorValue); 

あなたが実際にやっていることは、バックグラウンドカラーを永続データとして保存し、色を付けるアクティビティを再度開いたり開いたりしてからフェッチすることです。この方法の利点は、アプリを閉じるたびに好みの背景色が記憶されることです。私はこれが役立つことを願っています

+0

http://i.imgur.com/xZeiwKC.pngそれはいくつかの方法を解決できないと言います –

+0

あなたがアクティビティ内から呼び出す場合、getActivity()を呼び出す必要はありません。これに合わせてサンプルコードを変更しました。しかし、私はあなたがgetWindow()でエラーを受け取っている理由はよく分かりません。あなたのMainActvityサブクラスはAppCompatActivityかアクティビティだけですか? しかし、これはちょうどこの方法があなたのために働いていない場合、それを行うための他の多くの方法がある場合、背景色を変更する方法です。 – Reilem

+0

私はアンドロイドスタジオのコードを更新しましたが、 "。getWindow()"と "getActivity" Umm ..でエラーが発生しています。とにかく、 "Public Class MainActivity extends AppCompatActivity"と書いてあります。すべての3つのアクティビティで.. –

0

Ay Rueによると、2つのオプションがあります。そのボタンに静的変数を使用し、各アクティビティのonResumeで静的変数の値をチェックします(trueまたはfalse)。プライベート変数nightModeを保存してから、他の2つのアクティビティに移動する必要があるときに、この値をインテントに渡すこともできます。 既に設定済みで、背景色が更新されている場合は、背景色を設定しないでください。

関連する問題