Android从不同的活动改变背景颜色

Posted

技术标签:

【中文标题】Android从不同的活动改变背景颜色【英文标题】:Android changing background color from different activity 【发布时间】:2014-03-12 01:46:41 【问题描述】:

我正在尝试更改我的主要活动的背景颜色。从菜单中,我选择设置并带我进入另一个带有设置的活动。当我单击复选框更改背景时,它崩溃了。我正在尝试更改主要活动视图的背景。 LinearLayout 是主要活动的子活动,也是我希望更改的活动。但是我不断收到空指针,我可以做些什么来解决这个问题,或者我需要做什么才能让它工作?

设置活动类:

public class ShowSettingsActivity extends Activity 
    static final String TAG = "CAT";

    @Override
    protected void onCreate(Bundle savedInstanceState) 

        super.onCreate(savedInstanceState);
        setContentView(R.layout.show_settings_layout);

        SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);

        StringBuilder builder = new StringBuilder();

        builder.append("\n" + sharedPrefs.getBoolean("night_mode_key", true));
        builder.append("\n" + sharedPrefs.getString("time_usage_key", "-1"));
        builder.append("\n" + sharedPrefs.getString("language_key", "-1"));

        //builder.append("\n" + sharedPrefs.getBoolean("time_history_key", true));

        TextView settingsTextView = (TextView) findViewById(R.id.settings_text_view);
        settingsTextView.setText(builder.toString());    
    

偏好活动类:

public class QuickPrefsActivity extends PreferenceActivity implements
OnSharedPreferenceChangeListener 
    CheckBoxPreference isReg;
    static final String TAG = "QuickPrefsActivity";

    @Override
    public void onCreate(Bundle savedInstanceState)        
        super.onCreate(savedInstanceState);        
        addPreferencesFromResource(R.xml.preferences); 

        PreferenceManager.setDefaultValues(this,R.xml.preferences, false);

        CheckBoxPreference  night_checkbox = (CheckBoxPreference) findPreference("night_mode_key");        

    

    @Override
    public boolean onCreateOptionsMenu(Menu menu) 
        //menu.add(Menu.NONE, 0, 0, "Show current settings");
        return super.onCreateOptionsMenu(menu);
    

    @Override
    public boolean onOptionsItemSelected(MenuItem item) 
        switch (item.getItemId()) 
            case 0:
                startActivity(new Intent(this, ShowSettingsActivity.class));
                return true;
        
        return false;
    

    @Override
    public void onStart()
        super.onStart();
        SharedPreferences prefs=PreferenceManager.getDefaultSharedPreferences(QuickPrefsActivity.this);
    

    @Override
    protected void onResume() 
        super.onResume();
        // Set up a listener whenever a key changes
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    

    @Override
    protected void onPause() 
        super.onPause();
        // Unregister the listener whenever a key changes
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    

    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) 

        SharedPreferences s = getSharedPreferences("MY_PREFS", 0);

        // Create a editor to edit the preferences:
        SharedPreferences.Editor editor = s.edit();

        // Let's do something a preference value changes
        if (key.equals("night_mode_key")) 
        
            // Create a reference to the checkbox (in this case):
            CheckBoxPreference mHints = (CheckBoxPreference)getPreferenceScreen().findPreference("night_mode_key");

            //Lets change the summary so the user knows what will happen using a one line IF statement:
            //mHints.setSummary(mHints.isChecked() ? "Hints will popup." : "No hints will popup.");
            // Lets store the new preference:
            //SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
            boolean checkBoxValue = s.getBoolean("night_mode_key", false);

            if (checkBoxValue) 
            
                Log.d(TAG, "true onshared" + checkBoxValue);

                //setContentView(R.layout.activity_main);
                View v = findViewById(R.id.LinearLayout1);
                //View root = v.getRootView();

                v.setBackgroundColor(0xffffffff);
                /*((TextView) findViewById(R.id.hanziTextView)).setTextColor(0xff000000);
                  ((TextView) findViewById(R.id.timerTextView)).setTextColor(0xff000000);
                  ((TextView) findViewById(R.id.instructionTextView)).setTextColor(0xff000000);*/

            
            else
            
            /* findViewById(R.id.LinearLayout1).setBackgroundColor(0xff000000);
                ((TextView) findViewById(R.id.hanziTextView)).setTextColor(0xff444444);
                ((TextView) findViewById(R.id.timerTextView)).setTextColor(0xff444444);
                ((TextView) findViewById(R.id.instructionTextView)).setTextColor(0xff444444);*/
                Log.d(TAG, "false onshared" + checkBoxValue);
                                  

            //checkBox.setChecked(false);

            editor.putBoolean("night_mode_key", mHints.isChecked());

            // Save the results:
            editor.commit();
        

        if (key.equals("language_key")) 

            sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this);
           //ListPreference listPref = (ListPreference) sharedPreferences; 
           String entryvalue = sharedPreferences.getString( "language_key", "");
           Log.d(TAG, "Entryvalue " + entryvalue);

            if (entryvalue.equals("EN"))
            
                Log.d(TAG, "EN " + entryvalue);
                Toast.makeText(getBaseContext(), "English Selected", Toast.LENGTH_SHORT).show();
            
            else if (entryvalue.equals("CH"))
            
                Log.d(TAG, "CH " + entryvalue);
                Toast.makeText(getBaseContext(), "Chinese Selected", Toast.LENGTH_SHORT).show();
            
            else
            
                Toast.makeText(getBaseContext(), "You may not go where no1 has gone before, pick again!", Toast.LENGTH_SHORT).show();
            
        
    

主布局 xml...我正在尝试更改背景的那个:

<android.support.v4.widget.DrawerLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_
    android:layout_>        

    <android.gesture.GestureOverlayView
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/gestureOverlayView1"
        android:layout_
        android:layout_ 
        tools:context=".MainActivity">

        <LinearLayout 
            android:id="@+id/LinearLayout1"
            android:layout_
            android:layout_
            android:orientation="vertical"
            android:padding="10dp" 
            android:layout_gravity="start">

            <TextView
                android:id="@+id/timerTextView"
                android:layout_
                android:layout_
                android:layout_gravity="right"
                android:layout_marginRight="5sp"
                android:text="@string/startTime"
                android:textAppearance="?android:attr/textAppearanceSmall"
                android:textSize="30sp" />

        </LinearLayout>

    </android.gesture.GestureOverlayView>

    <FrameLayout
        android:id="@+id/content_frame"
        android:layout_
        android:layout_ />

    <!-- The navigation drawer -->
    <ListView android:id="@+id/left_drawer"
        android:layout_
        android:layout_
        android:layout_gravity="start"
        android:choiceMode="singleChoice"
        android:divider="#666"
        android:dividerHeight="1dp"
        android:background="#333"
        android:paddingLeft="15sp"
        android:paddingRight="15sp"
        />    
</android.support.v4.widget.DrawerLayout>

【问题讨论】:

我建议您花几个小时阅读文档或遵循一些教程(有数千个)并尝试理解它们。从我所见,我可以告诉你几乎不知道你在做什么,所以很难纠正你的代码。 感谢您的宝贵时间。我不想给人这样的印象,我认为没有必要放置我的整个代码,所以这就是代码设置区域很少的原因。我认为从概念上讲我知道出了什么问题。我得到一个空值,因为我不在视图中,我正在尝试在另一个视图中更改某些内容。我不确定您是否甚至可以超越视图并且它会起作用。这就是为什么我在这里的论坛。您需要的任何具体内容。如有必要,我会添加更多代码。 好的,我更新了更多代码。 如果您注意到 onSharedPreferenceChanged 函数,特别是 if (checkBoxValue) 函数,您将看到我正在尝试做什么。感谢您的帮助。 【参考方案1】:

它会崩溃,因为目标LinearLayout 在另一个活动中。您可以做的是.. 将背景颜色或设置保存在 Sharedpreferences 文件中.. 然后在主活动中再次调用它以更改颜色...

 if (checkBoxValue) 
         
            SharedPreferences sp = getSharedPreferences("settings", Context.MODE_PRIVATE);
            Editor edit = sp.edit();
            edit.putString("COLOR", "0xffffffff")
         

然后在你的主要检查 sharedPreferences 的值...

...
SharedPreferences sp = getSharedPreferences("settings", Context.MODE_PRIVATE);
v.setBackgroundColor(sp.getString("COLOR"), Color.WHITE); // here check if the value available, if not put the color to default.. maybe white?...

这是未经测试的代码..我写得很粗略..但我希望你明白了。 请给我反馈

【讨论】:

如果我从主要活动进入此首选项设置活动,这项工作是否可行。然后我选择复选框,然后我使用手机上的按下后退按钮,当我再次进入主要活动时,我需要一些东西来自动刷新吗?我需要在主要活动中安装一个监听器吗? 如果您注意到 onSharedPreferenceChanged 函数,特别是 if (checkBoxValue) 函数,您将看到我正在尝试做的事情。感谢您的帮助。 您可以在 onResume 中添加 sharedPreferences 和 setBackgroundColor 而不是在 onCreate 中。在这种情况下,它会在您第一次启动活动或 onBackPress 时起作用 我认为你对简历的看法是正确的。我使用 logcat 使用后退按钮快速从设置检查到主,它似乎触发了它。如果这解决了,我会回复你。谢谢。【参考方案2】:

您不能从另一个活动访问主要活动的布局视图。这样做的方法是向再次启动主要活动的意图添加额外的内容,或者您​​可以使用 SharedPreferences。

【讨论】:

以上是关于Android从不同的活动改变背景颜色的主要内容,如果未能解决你的问题,请参考以下文章

设置android背景颜色异步

如何改变webView背景颜色?

Gridview背景颜色在Android中滚动时改变颜色

安卓界面布局如何改变所有button的背景颜色?

java窗口的背景颜色

c 中改变背景颜色的函数是啥?各种颜色的代码是啥?