从另一个活动动态设置背景图像的一个活动?

时间:2014-01-06 09:08:30

标签: android background

我正在尝试从另一个活动中设置一个活动的背景图像

活动1 - 是一个水平滚动视图,我正在加载一些图像供用户使用此方法选择

//set an onclick listener for imageView
         imageView.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(getApplicationContext(), "Clicked - " + imageNames[i] , Toast.LENGTH_LONG).show();
                NewNote note = new NewNote();
                note.setMyBackground(images[i]);
                finish();
            }

         });

这里images [i]绝对不是空的,因为我以前用过它来加载Horizo​​ntalScrollView

活动2 - NewNote - 我尝试使用以下方法设置其背景的活动

public void setMyBackground(Drawable d){
        FrameLayout fl = (FrameLayout)findViewById(R.id.FLNote);
        fl.setBackground(d);
    }

如果我注释掉note.setMyBackground(images [i]);没有空指针异常

其他方面我得到以下Logcat

01-06 03:58:34.150: E/AndroidRuntime(1430): FATAL EXCEPTION: main
01-06 03:58:34.150: E/AndroidRuntime(1430): Process: com.example.mynote, PID: 1430
01-06 03:58:34.150: E/AndroidRuntime(1430): java.lang.NullPointerException
01-06 03:58:34.150: E/AndroidRuntime(1430):     at android.app.Activity.findViewById(Activity.java:1883)
01-06 03:58:34.150: E/AndroidRuntime(1430):     at com.example.mynote.activities.NewNote.setMyBackground(NewNote.java:50)
01-06 03:58:34.150: E/AndroidRuntime(1430):     at com.example.mynote.activities.NoteBackGroundPicker$1.onClick(NoteBackGroundPicker.java:65)
01-06 03:58:34.150: E/AndroidRuntime(1430):     at android.view.View.performClick(View.java:4424)
01-06 03:58:34.150: E/AndroidRuntime(1430):     at android.view.View$PerformClick.run(View.java:18383)
01-06 03:58:34.150: E/AndroidRuntime(1430):     at android.os.Handler.handleCallback(Handler.java:733)
01-06 03:58:34.150: E/AndroidRuntime(1430):     at android.os.Handler.dispatchMessage(Handler.java:95)
01-06 03:58:34.150: E/AndroidRuntime(1430):     at android.os.Looper.loop(Looper.java:137)
01-06 03:58:34.150: E/AndroidRuntime(1430):     at android.app.ActivityThread.main(ActivityThread.java:4998)
01-06 03:58:34.150: E/AndroidRuntime(1430):     at java.lang.reflect.Method.invokeNative(Native Method)
01-06 03:58:34.150: E/AndroidRuntime(1430):     at java.lang.reflect.Method.invoke(Method.java:515)
01-06 03:58:34.150: E/AndroidRuntime(1430):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:777)
01-06 03:58:34.150: E/AndroidRuntime(1430):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:593)
01-06 03:58:34.150: E/AndroidRuntime(1430):     at dalvik.system.NativeStart.main(Native Method)

NewNote.java

package com.example.mynote.activities;

import android.app.Activity;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.widget.FrameLayout;
import android.widget.ImageView;

import com.example.mynote.R;

public class NewNote extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.note_layout);
        //getActionBar().setDisplayHomeAsUpEnabled(true);
        getActionBar().setHomeButtonEnabled(true);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.new_note_action_bar_items, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item){
        switch(item.getItemId()){
        case R.id.action_done:
            finish();
            return true;
        case R.id.action_bgchooser:
            Log.d("ACTION","BackgroundChooser Activity");
            Intent i2 = new Intent(NewNote.this,NoteBackGroundPicker.class);
            startActivity(i2);
            return true;
        default:
            return super.onOptionsItemSelected(item);
        }
    }

    public void setMyBackground(Drawable d){
        FrameLayout fl = (FrameLayout)findViewById(R.id.FLNote);
        fl.setBackground(d);
    }

}

note_layout.xml

<FrameLayout 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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:background="@drawable/diary"
    tools:context=".NewNote"
    android:id="@+id/FLNote"
     >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"
        android:src="@drawable/icon" />

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="match_parent"
        android:layout_height="346dp"
        android:layout_gravity="bottom" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

         <EditText
             android:id="@+id/editText1"
             android:layout_width="match_parent"
             android:layout_height="290dp"
             android:ems="10" >

            </EditText>

         <Button
             android:id="@+id/button1"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_gravity="center"
             android:text="Save" />

        </LinearLayout>



    </ScrollView>

</FrameLayout>

如何摆脱空指针异常????

4 个答案:

答案 0 :(得分:0)

NewNote是一个Activity类。

你有

  NewNote note = new NewNote();

错误。

检查Raghav Sood的答案

Can i Create the object of a activity in other class?

您可以使用startActivityForResult。使用intent传递drawable的url或资源id,然后将背景设置为FrameLayout(初始化后)。

答案 1 :(得分:0)

正如其他人所提到的,你不会在Android中发起自己的活动。相反,您可以使用隐式startActivity致电Intent来开始新活动。

您似乎应该在此意图的附加内容中传递来自images[i]的数据。

如果images [i]是位图,那么传递该位图的源(它是从中加载的URL,资源ID等)可能会更好,因为位图可能太大(或很慢)而无法放入捆绑。

答案 2 :(得分:0)

如果之前已经打开了NewNote活动,那么您可以使用类似

的内容
NewNote.fl.setbackgroundResource(//your images);

声明你在Newnote活动中扮演全球角色。

或者如果您要从此活动创建NewNote活动,那么您可以从该活动中以相同的方式检查第一个活动所需的条件或任何内容。

或者你可以通过意图传递图像,如果它们不是太大。

但是如果您创建一个实用程序或帮助程序类,将保持健康和良好的编码,将这些图像保持静态,并在您需要的任何活动中随时调用。

答案 3 :(得分:0)

在NewNote Activity中声明布局的公共变量为

public static FrameLayout f1;

和onNreate of NewNote Activity

fl =(FrameLayout)findViewById(R.id.FLNote);

从其他活动改变其背景,比如活动A. 打电话给

NewNote.f1.setBackground(图像[1]);

请注意,images [i]必须是可绘制的图像。