2016-10-05 14 views
1

状態がある場合、無効化ボタンのUIボタンを更新する方法条件:値が1.0になると、ボタンの電源がオフになります&、値が0になるとボタンの電源がオフになります。ボタンに常に新しい値が表示されるようにします。更新ボタンのAsynctask

これは私のコードです:GETApi

public class GetApi extends AsyncTask<Object, Object, Value[]> { 
     private final String API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxx"; 
     private final String SWITCHID = "xxxxxxxxxxxxxxxxxxxxxxxxx"; 
     private ImageButton On,Off ; 

     @Override 
     protected Value[] doInBackground(Object... params) { 
      ApiClient apiClient = new ApiClient(API_KEY); 
      Variable statusSwitch = apiClient.getVariable(SWITCHID); 
      Value[] variableValues = statusSwitch.getValues(); 

      return variableValues; 
     } 
     @Override 
     protected void onPostExecute(Value[] variableValues) { 

      String status = Double.toString(variableValues[0].getValue()); 
      mSwitchStatus.setText(status); 

      if(status.equals("1.0")){ 
       On.setVisibility(View.INVISIBLE); 
      } 

     } 
    } 

ため

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_controller, container, false); 
     mSwitchStatus = (TextView) rootView.findViewById(R.id.statusSwitch); 
     ImageButton On = (ImageButton)rootView.findViewById(R.id.on); 
     ImageButton Off = (ImageButton)rootView.findViewById(R.id.off); 


     callAsynchronousTask(); 

      On.setOnClickListener(new View.OnClickListener() 
      { 
       @Override 
       public void onClick(View v) 
       { 
        Toast.makeText(getActivity().getApplication(), "ON", Toast.LENGTH_SHORT).show(); 
        SendApi sendApi = new SendApi(); 
        sendApi.execute(); 
       } 
      }); 

      Off.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) 
       { 
        Toast.makeText(getActivity().getApplication(), "OFF", Toast.LENGTH_SHORT).show(); 
        SendApi sendApi = new SendApi(); 
        sendApi.execute(); 
       } 
      }); 
     // Inflate the layout for this fragment 
     return rootView; 
    } 

繰り返しAsyncTask

public void callAsynchronousTask() { 
     final Handler handler = new Handler(); 
     Timer timer = new Timer(); 
     TimerTask doAsynchronousTask = new TimerTask() { 
      @Override 
      public void run() { 
       handler.post(new Runnable() { 
        public void run() { 
         try { 
          GetApi getApi = new GetApi(); 
          getApi.execute(); 

         } catch (Exception e) { 
          android.util.Log.i("Error", "Error"); 
          // TODO Auto-generated catch block 
         } 
        } 
       }); 
      } 
     }; 
     timer.schedule(doAsynchronousTask, 0, 100); 
    } 

AsyncTask Fragment_controller.xml

<?xml version="1.0" encoding="utf-8"?> 
<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:orientation="vertical" 
    android:background="#1d4851" 
    tools:context=".activity.ControllerFragment"> 

    <ImageButton 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/off" 
     android:src="@drawable/ic_off" 
     android:background="@null" 
     android:layout_marginTop="79dp" 
     android:layout_below="@+id/textView2" 
     android:layout_alignLeft="@+id/on" 
     android:layout_alignStart="@+id/on"/> 

    <ImageButton 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/on" 
     android:background="@null" 
     android:src="@drawable/ic_on" 
     android:layout_marginTop="87dp" 
     android:layout_alignTop="@+id/off" 
     android:layout_centerHorizontal="true"/> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text=" Water Pump Controller " 
     android:id="@+id/textView2" 
     android:textColor="#ffffff" 
     android:textSize="20dp" 
     android:layout_marginTop="19dp" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text=" " 
     android:id="@+id/statusSwitch" 
     android:textColor="#ffffff" 
     android:textSize="20dp" 
     android:layout_marginTop="250dp" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 

</RelativeLayout> 
+0

このコードではどのようなエラーが発生していますか? –

+0

何もありませんが、ボタンが更新されていません。status.getText()。toString()。equals( "1.0");私のアプリケーションがクラッシュする @AnwarKamal – redim

+0

これをstatus.getText()。toString()。equals( "1"); –

答えて

0

あなたが

ImageButton On = (ImageButton)rootView.findViewById(R.id.on); 

ようonCreateViewinitializeあなたのボタンを持っているとonPostExecute()でそれにアクセスしようとしている。彼らはグローバルではありません。そして

はあなたが setEnable(false)ない setVisibility

を呼び出す必要が無効にそして、あなたはまた、としてそれを送ることができますRathna Kumaranは語りました。

public class GetApi extends AsyncTask<Object, Object, Value[]> { 
     private Button button; 
     public GetApi(Button mButton){ 
      this.button = button; 
     } 
     private final String API_KEY = "xxxxxxxxxxxxxxxxxxxxxxxxxx"; 
     private final String SWITCHID = "xxxxxxxxxxxxxxxxxxxxxxxxx"; 

     @Override 
     protected Value[] doInBackground(Object... params) { 
      ApiClient apiClient = new ApiClient(API_KEY); 
      Variable statusSwitch = apiClient.getVariable(SWITCHID); 
      Value[] variableValues = statusSwitch.getValues(); 

      return variableValues; 
     } 
     @Override 
     protected void onPostExecute(Value[] variableValues) { 

      String status = Double.toString(variableValues[0].getValue()); 
      mSwitchStatus.setText(status); 

      if(status.equals("1.0")){ 
       button.setVisibility(View.INVISIBLE); 
      } 

     } 
    } 
+0

アクティビティまたはフラグメントでinitiaizeを持っているメインクラス – redim

+0

にImageボタンを初期化しました。 @Rathna Kumaranの回答のサンプルもアクティビティクラス – Nepster

+0

の回答が追加されました。 – redim

0

1. AsyncTaskでコンストラクタを作成し、ボタンをパラメータとして送信します。例。 getApi(buttonOne).execute();

  1. getApi()コンストラクタ内でローカル変数 "Button"を宣言し、それに割り当てます。

  2. inPostExecute() - > buttonOne.setVisibility(View.INVISIBLE)です。

asyncTaskでは、 "onPostExecute()"はメインスレッドで実行されます。 UI要素はメインスレッドでのみ更新する必要があります。つまり、UI要素をAsynctaskに渡して、onPostExecute内で更新することができます。

+0

私に例を与えることができます – redim

+0

CallAsync(myButton).execute(); CallAsyncはAsyncTaskを拡張します。 CallAsync(ボタン){this.button =ボタン; } doInBackgrounds(){....} onPostExecute(){button.setVisibility(View.INVISIBLE)}} –

関連する問題