0

この質問はおそらく何度も聞かれている..はい!いわゆる「ブラック スクリーンの問題」に直面しています。
最初のアクティビティは、ログインが行われるメイン アクティビティであり、このアクティビティの後に、ユーザー アカウントの簡単な概要レポートである次のアクティビティが続きます。
さて、このレポートでは、データセットを取得して解析し、それを使用してテーブルを動的に作成します。ヴィランブラックスクリーンがここに登場!! 表のように、レポートは適切にレンダリングされますが、その画面では、この黒い半透明のレイヤーが表示され続けます。
ハンドラー、asynctask、半透明のテーマを使用してすべてを試しましたが、何も役に立ちません!! 概要レポートを読み込むと、悪役がまだ表示されます。「戻る」ボタンを押すと消え、最初にロードしたときに予想されるように、画面は正常に表示されます..私のコーディングアプローチ(動的にテーブルを生成する)またはエミュレータの問題か何かです。

My emulator details are as follows:
CPU:ARM
Target: Android 2.3.3
skin: WVGA800
sd card:1024M

誰か私を救ってください!!

編集:
私の2番目の活動では、次のことを行います:

   public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_summary_report);
        ad = new AlertDialog.Builder(this).create();
        boolean is = IsConnectedToNetwork(); 
        if (is == true){
                Handler execWS = new Handler();
                execWS.post(callWS);//Fetch Data via web service and parse it
                if(result != null){
                    Handler genUI = new Handler();
                    genUI.post(createUI);// generate the table based on "result". ie. in a for loop i create textviews and append it to the table layout
                }
            }
        else{
            Error = "Connection Failed. Try Again!";
        }
        if(Error.length() != 0){
        ad.setMessage(Error);
        ad.setTitle("Error..");
            ad.show();
        }
    }

2 番目のアクティビティの Xml レイアウト..

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:baselineAligned="false"
    android:gravity="center"
    android:orientation="vertical">

    <TableLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dip">
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:contentDescription="@string/Logo"
                android:src="@drawable/complogo" 
                android:gravity="top"/>
            <TextView
                android:id="@+id/lblLoginInfo"  
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:gravity="center_horizontal"/>
    </TableLayout>


    <TableLayout
        android:id="@+id/tblSummRep"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="4"
        android:padding="5dip">
    </TableLayout>
    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:padding="5dip">

            <TextView
                android:id="@+id/AppName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="@string/AppName"
                android:textColor="#ff6600" />

            <TextView
                android:id="@+id/AppVersion"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="@string/AppVersion"
                android:textColor="#ff6600" />

            <TextView
                android:id="@+id/Disclaimer"
                        android:gravity="center"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@string/Disclaimer"                   
                android:textColor="#ff6600" />
    </TableLayout>
</LinearLayout>

テキストビューを「tblSummRep」に追加します..

私のasynctaskクラスを更新してください..

   private class ShareWork extends AsyncTask<Void, Void, Boolean>{
        ProgressDialog pDlg;
        //String[][] result = null;
        protected void onPreExecute(){
            pDlg.setMessage("Please wait while the Report Loads...");
            pDlg.show();
        }

        @Override
        protected Boolean doInBackground(Void... params) {
            boolean RetVal = false;
            //my fetch code
            return RetVal;
        }


        protected void onPostExecute(Boolean value){
            if(value == true){
                pDlg.setMessage("Please try again later!!");
                pDlg.show();
            }
            else{
                createUI.run();

            }
        }
    }
4

1 に答える 1

2

「黒い画面の問題」とは何を指しているのかわかりませんが、データを取得していると述べています(リモートサーバーからだと思います)。UIスレッドをブロックすることについて私には思えます。アクティビティのどのメソッドでデータを取得していますか (おそらく onCreate で)? リモート サーバーへのクエリなど、時間のかかる操作をグラフィカル スレッドで実行しないでください (数秒かかる場合があります)。このような場合、常にAsyncTaskを使用する必要があります。ユーザーは、バックグラウンドで何が起こっているかについてのフィードバックを受け取る必要があるため、通常は ProgressBar (または少なくともスピナー) を使用することをお勧めします。

AsyncTask で同様の問題を解決する方法については、こちらを参照してください。

アップデート

コードを投稿しました。問題は(私が推測したように)次のコード行にあります。

execWS.post(callWS);//Fetch Data via web service and parse it

これはWSコールだと思います。ここで UI スレッドをブロックしています。私が提供したリンクと同じ方法で AsyncTask を作成し、タスクの完了時に残りのコードを実行します (エラーまたはデータを含む動的テーブルを表示します)。

AsyncTask は次のようになります (試したことはありません)。

private class LoadTableTask extends AsyncTask<URL, Integer, Object> {
     protected Object doInBackground(URL... urls) {
         Handler execWS = new Handler();
         execWS.post(urls[0]);//Fetch Data via web service and parse it
         return result;
     }

     protected void onProgressUpdate(Integer... progress) {
         //Not used in your case. It would be a good idea to create an undefined progress dialog in your case
     }

     protected void onPostExecute(Object result) {
         if(result != null){
                Handler genUI = new Handler();
                genUI.post(createUI);// generate the table based on "result". ie. in a   for loop i create textviews and append it to the table layout
         }

     }
 }

onCreate() メソッドは次のように置き換えられます。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_summary_report);
    ad = new AlertDialog.Builder(this).create();
    boolean is = IsConnectedToNetwork(); 
    if (is == true){
            new LoadTableTask().execute(callWS);
        }
    else{
        Error = "Connection Failed. Try Again!";
    }
    if(Error.length() != 0){
    ad.setMessage(Error);
    ad.setTitle("Error..");
        ad.show();
    }
}
于 2013-01-18T12:07:21.243 に答える