2

我还希望能够以编程方式更改图像,以便我可以附加侦听器并在特定点更改图像。我正处于早期阶段,我无法设置我拥有的视图;

//inside my activity

LinearLayout mLayout;

//then inside the oncreate

mLayout = (LinearLayout) findViewById(R.id.main1);
setContentView(mLayout);
mLayout.setBackgroundResource(R.drawable.pic);

这在 Eclipse 中编译得很好,但是当我运行它时,应用程序无法启动。

我正在寻找带有音乐的幻灯片。

我已经尝试了下面给出的解决方案,但仍然出现错误;

12-06 11:51:11.656:E/AndroidRuntime(238):未捕获的处理程序:线程主因未捕获的异常而退出

最终,我想要一个幻灯片放映,它允许我以编程方式设置背景图像,所以我试图获取视图的句柄,以便我可以通过侦听器设置背景。

我已经设置了一个视图 res/layout/slider.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main2"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <SeekBar android:id="@+id/seek"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:max="100"
        android:progress="50"
        android:secondaryProgress="75" />

    <TextView android:id="@+id/progress"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

    <TextView android:id="@+id/tracking"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

SeekBar mSeekBar;
TextView mProgressText;
TextView mTrackingText;
LinearLayout mLayout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mSeekBar = (SeekBar)findViewById(R.id.seek);
    mSeekBar.setOnSeekBarChangeListener(this);
    mProgressText = (TextView)findViewById(R.id.progress);
    mTrackingText = (TextView)findViewById(R.id.tracking);


    setContentView(R.layout.slider);
    mLayout = (LinearLayout) findViewById(R.id.main2);
    setContentView(mLayout);
    mLayout.setBackgroundResource(R.drawable.mumbai);

    }

    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromTouch) {
            mProgressText.setText(progress + " " +
                    getString(R.string.seekbar_from_touch) + "=" + fromTouch);
            //mLayout = (LinearLayout) findViewById(R.id.main1);
            //mLayout.setBackgroundResource(R.drawable.boats);
    }

        public void onStartTrackingTouch(SeekBar seekBar) {
            mTrackingText.setText(getString(R.string.seekbar_tracking_on));
        }

        public void onStopTrackingTouch(SeekBar seekBar) {
            mTrackingText.setText(getString(R.string.seekbar_tracking_off));
        }
}

嗨,普拉蒂克,正如我在下面所写的,我仍然遇到错误。

12-06 13:02:34.074:E/AndroidRuntime(808):未捕获的处理程序:线程主因未捕获的异常而退出

虽然我认为它的信息量不是很大。这是在我注释掉对 setContentView(mLayout) 的第二次调用之后。

我刚刚通过调试器运行它,它在 mSeekBar.setOnSeekBarChangeListener(this);

我的建议没有成功,并尝试了一种新策略我现在正在尝试使用 LayoutInflater 但是我在 AVD 上遇到了同样的错误,当我单步执行代码时,就像我想我要离开一样调用“inflater.inflate”的行给出错误“找不到源”并在调试器代码窗格中打开一个窗口,允许我导航。我在 xml 中创建了 2 个视图,保存时没有收到任何错误

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class PwdDialogActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        LayoutInflater inflater = (LayoutInflater) getSystemService
            (Context.LAYOUT_INFLATER_SERVICE);
        final View layout = inflater.inflate(R.layout.password_dialog,
                (ViewGroup)findViewById(R.id.root));
        //layout.setBackgroundResource(R.drawable.boats);
        AlertDialog.Builder builder = new AlertDialog.Builder(this);
        builder.setView(layout);
        builder.setTitle(R.string.app_name);
    }
}

我想知道这个错误和之前的错误是否与代码无关,并且更关心我的设置。但是我已经创建了在版本 3 中运行的项目和 AVD。我查看了 LayoutInflater,它说它从版本 1 开始就已经存在。

4

2 回答 2

1

没有设置任何布局setContentView()并通过它的 ID 查找对象,它总是为空。

您需要先设置布局,然后从该布局中获取对象 ID

setContentView(R.layout.yourlayout); // here set the layout where object or control where defined it
mLayout = (LinearLayout) findViewById(R.id.main1);
setContentView(mLayout); // and then you can set that object
于 2011-12-06T11:10:47.097 回答
0

改变

mLayout = (LinearLayout) findViewById(R.id.main1);
setContentView(mLayout);

setContentView(R.layout.yourLayoutFile);
mLayout = (LinearLayout) findViewById(R.id.main1);

原因:findViewById适用于当前内容视图。在您设置内容视图之前,findViewById将始终返回 null。因此,您将在发布的最后一行收到 NullPointerException。

于 2011-12-06T11:04:52.353 回答