1

次のような Android xml レイアウト ファイルがあります。

<RelativeLayout 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:background="#184A64">

<ImageView
    android:id="@+id/logoTop"
    android:layout_width="fill_parent"
    android:layout_height="42dip"
    android:layout_alignParentTop="true"
    android:layout_gravity="center"
    android:background="#F1CF2F"
    android:contentDescription="@string/descLogoTop"
    android:padding="4dip"
    android:src="@drawable/logoTop" />

<ImageView
    android:id="@+id/logoBot"
    android:layout_width="fill_parent"
    android:layout_height="42dip"
    android:layout_alignParentBottom="true"
    android:layout_gravity="center"
    android:background="#F1CF2F"
    android:contentDescription="@string/descLogoBot"
    android:padding="4dip"
    android:src="@drawable/logoBot" />

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_below="@id/logoTop"
    android:orientation="vertical"
    android:padding="6dip" >

    <TextView
        android:id="@+id/data"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="left"
        android:text="date"
        android:textColor="#FFFFFF"
        android:textSize="12sp"
        android:textStyle="normal" />

    <ImageView
        android:id="@+id/icon"
        android:layout_width="103dip"
        android:layout_height="62dip"
        android:layout_marginBottom="6dip"
        android:layout_marginRight="6dip"
        android:contentDescription="@string/descLogo"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/toptext"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:text="title"
        android:textColor="#F1CF2F"
        android:textSize="12sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/bottomtext"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:singleLine="false"
        android:text="text"
        android:textColor="#FFFFFF"
        android:textSize="12sp" />
</LinearLayout>
</RelativeLayout>

画面の上下に 2 つの ImageView があり、中央に LinearLayout がある単純なレイアウトです。私が欲しいのは、Bundle からいくつかのデータを取得し、それを LinearLayout に書き込むことです。このために、次の Java コードがあります。

public class NewsD extends Activity {

    private ProgressDialog m_ProgressDialog = null; 
    private Runnable viewNews;
    private Bundle bundle;
    private News m_news = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_news_activity);

        bundle = this.getIntent().getExtras();

        m_ProgressDialog = ProgressDialog.show(NewsD.this,    
                this.getString(R.string.wait), this.getString(R.string.receiving, true));

        runOnUiThread(new Runnable(){
            @Override
            public void run() { 
                getNews();
            }
        });                                 
    }

    public void getNews() {

        m_news = new News();
        m_news.setNewsTitle(bundle.getString("title"));
        m_news.setNewsText(bundle.getString("text"));
        m_news.setNewsDate(bundle.getString("data"));
        m_news.setNewsPhoto(bundle.getString("photo"));

        LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = vi.inflate(R.layout.activity_news_activity, null);

        try{
            ImageView iv = (ImageView) v.findViewById(R.id.icon);
            TextView tt = (TextView) v.findViewById(R.id.toptext);
            TextView bt = (TextView) v.findViewById(R.id.bottomtext);

            if (iv != null) {
                try{
                    Bitmap bmp = Utils.getBitmapFromURL("http://www.myserver.com/IMG/" + m_news.getNewsPhoto());
                    if (bmp == null){
                        Log.i("PHOTO ERROR", "http://www.myserver.com/IMG/" + m_news.getNewsPhoto());
                    }
                    iv.setImageBitmap(bmp);                     
                } catch (Exception e){
                    Log.e("IMAGE ERROR", e.getMessage() + " - " + e.getStackTrace());
                }
            }
            if (tt != null) {
                tt.setText(m_news.getNewsTitle());
            }
            if(bt != null){
                bt.setText(m_news.getNewsText());
            }   
            TextView dt = (TextView) v.findViewById(R.id.data);         
            Date nd = new Date(Long.parseLong(m_news.getNewsDate())*1000);
            Calendar cal = Calendar.getInstance();
            cal.setTime(nd);
            dt.setText(cal.get(Calendar.DAY_OF_MONTH) + "/" + cal.get(Calendar.MONTH) + "/" + cal.get(Calendar.YEAR));

        } catch (Exception e){
            Log.e("ERROR", e.getMessage());
        }

        m_ProgressDialog.dismiss();
    }
}

問題は、3 つの TextView と ImageView が、xml で指定されたデフォルトのテキスト/画像を表示することです。確認しました

ImageView iv = (ImageView) v.findViewById(R.id.icon);
TextView tt = (TextView) v.findViewById(R.id.toptext);
TextView bt = (TextView) v.findViewById(R.id.bottomtext);

ステートメントと正常に動作するようです。null ではありません。また、バンドルからのデータは問題ありません。これについて 1 時間ほど調査し、コードを変更して runOnUiThread() ステートメントを追加し、getNews() 関数が UI スレッドで実行されるようにしました。しかし、何も機能しません。誰でも私を助けてもらえますか?

前もって感謝します。

4

2 に答える 2

3

さて、問題は、getNews 呼び出しでビューをメモリにインフレートしているのに、そのビューが表示されないことです。setContentView を呼び出すと、ビューはすでに膨張しています。したがって、代わりに、次のようなビューを使用します。

public void getNews() {

    m_news = new News();
    m_news.setNewsTitle(bundle.getString("title"));
    m_news.setNewsText(bundle.getString("text"));
    m_news.setNewsDate(bundle.getString("data"));
    m_news.setNewsPhoto(bundle.getString("photo"));



    try{
        ImageView iv = (ImageView) findViewById(R.id.icon);
        TextView tt = (TextView) findViewById(R.id.toptext);
        TextView bt = (TextView) findViewById(R.id.bottomtext);
于 2012-09-06T16:28:34.153 に答える
0

NetworkOnMainThreadException を取得していると思いますが、例外をキャッチしているため、取得している例外に関するデータが失われています。あなたの場合、 RunOnuiThread は正しい方法ではありません。

Asynctask を使用して、layoutinflation、setText、setImageBitmap などのすべての UI コードを OnPreExecute または OnPostExecute に移動し、行の下を Asynctask の doInbackground に移動します。

Bitmap bmp = Utils.getBitmapFromURL("http://www.myserver.com/IMG/" + m_news.getNewsPhoto());
于 2012-09-06T16:31:17.137 に答える