1

サーバーのステータス(オンラインかオフラインか)を表示するプログラムがあります。ユーザーに読み込みを示すためにスピナーを配置し、AsyncTask でオンライン/オフライン イメージをオフにして、読み込み中にスピナーをオンにし、完了したら反対のことを行います。コードはその仕事をしますが、何らかのグリッチによって完了したように感じ、後でそれを壊す可能性があるので、今すぐ修正したいと思います. 基本的には、オンライン/オフライン イメージの変数とスピナー スワップ値の変数が何らかの方法で変更されますが、その理由はわかりません。

これが私のコードです:

public View background;
public View status;
public View loading;

class CheckStatusTask extends AsyncTask<Void, Void, Boolean> { 

    //show loading
    protected void onPreExecute(){
        status.setVisibility(View.VISIBLE);<-- this shows the spinner but should show online/offline
        //loading.setVisibility(View.INVISIBLE);<-- this shows the online/offline but should show the spinner
    }

    //check if server is online
    protected Boolean doInBackground(Void... params) {
        return CheckStatus.check();
    }

    //set status bar to offline if flag is false
    protected void onPostExecute(Boolean flag) {
        status.setVisibility(View.INVISIBLE);<-- this shows the spinner but should show online/offline
        //loading.setVisibility(View.VISIBLE);<-- this shows the online/offline but should show the spinner
        if(!flag){
            background.setBackgroundResource(R.layout.offline);
            status.setBackgroundResource(R.drawable.offline);<-- correct 
        }
    }

}

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        background = findViewById(R.id.status);
        status = findViewById(R.id.image); 
        loading = findViewById(R.id.loading);
        new CheckStatusTask().execute();
    }

XML ファイル:

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true">
<RelativeLayout
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" android:background="#ffffff">

    <!--  Status  Starts-->
    <LinearLayout android:id="@+id/status"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="@layout/online"
            android:paddingTop="5dip"
            android:paddingBottom="5dip">
            <!-- Online/Offline Start-->


            <ImageView android:id="@+id/image"
                        android:src="@drawable/logo"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginLeft="10dip"/>
            <ProgressBar
                android:id="@+id/loading"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
            <!-- Online/Offline Ends -->

    </LinearLayout>
    <!--  Status Ends -->


    <!-- Main Form -->
    <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:padding="10dip"
      android:layout_below="@id/status">

        <TextView 
            android:id="@+id/text"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textColor="#372c24"
            android:text="Home"/>

    </LinearLayout>
    <!-- Main Form Ends -->
</RelativeLayout>
</ScrollView>

ご覧のとおり、ステータス変数はオンライン/オフラインの画像を表示するように定義され、読み込み変数はスピナーを表示するように定義されていますが、これは正反対です。これは、この特定の機能に対してのみ発生します。

4

1 に答える 1

1
android:background="@layout/online"

この行を使用すると、線形レイアウトの背景を、res/layout/フォルダー内にあるシェイプ ドローアブルに設定できます。

シェイプ ドローアブルなどのドローアブル リソースは、res/drawable/フォルダー内に配置する必要があります。それをレイアウト フォルダー内に格納すると、リソースの R.id 値が混乱します。なぜこのような問題が発生したのか、正確にはわかりません。ただし、これらの online.xml と offline.xml を移動しres/drawable/、その中のものを削除するとres/layout/修正されるはずです。

ファイルを移動したら、上記の行を次のように変更します。

android:background="@drawable/online"

xml ドローアブルリソースの詳細については、ドローアブル リソースを参照してください。

于 2013-01-31T00:21:29.463 に答える