2017-01-09 1 views
0

私のテストコードアプリでは、if文にgetVisibilityを設定することに問題があります。getVisibility()from inner Thread

基本的に、アプリは(GONEからVISIBLEに)1つのTextView tv1を表示し、その中に2つのボタンを含む1つのLinearLayout LL1を表示する必要があります。btn1 & btn2いずれかのボタンを押すと、LL1が消えて(VISIBLEからGONEに戻ります)、その代わりに、押されたボタンに応じて新しいtv2またはtv3が表示されます(GONEからVISIBLEへ)。 tv4はLL1がGONEになるのを待ってから表示されます。 1秒の間隔が外見の間に設定されます。

IF部が動作しなくなるまで、すべてが正常に実行されます。私はまた、

if (btn1.isPressed() || btn2.isPressed()) 

if (tv2.getVisibility()==View.VISIBLE || tv3.getVisibility()==View.VISIBLE) 

を試してみましたが、それは仕事をdidntの。私は問題が私がgetVisibilityにアクセスする方法だと思う。

グローバルboolean x=false;を定義してから、OnClickListener設定でx=true;を設定しましたが、if (x) {...はfalseを返します。

ステートメントを作成する方法!

レイアウトファイルのすべて(tv1..tv4、btn1、btn2、LL1)は事前定義されており、inittialyはGONEに設定されています。 それはまだレンダリングされていないので、これは、このようには見えない、まだ、>

@Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.test_layout); 
      Thread mainThread = new Thread(
        new Runnable() { 
         @Override 
         public void run() { 
          startApp(); 
         } 
        } 
      ); 
      mainThread.start(); 
     } 

public void startApp() { 
     Button btn1 = (Button) findViewById(R.id.btn1); 
     Button btn2 = (Button) findViewById(R.id.btn2); 
     TextView tv1 = (TextView) findViewById(R.id.line1); 
     TextView tv2 = (TextView) findViewById(R.id.line2); 
     TextView tv3 = (TextView) findViewById(R.id.line3); 
     TextView tv4 = (TextView) findViewById(R.id.line4); 
     LinearLayout LL1 = (LinearLayout) findViewById(R.id.LL1); 

     show_line(tv1, 1000); 
     btnLL(LL1, btn1, btn2, tv2, tv3); 

     //THIS IS THE PROBLEM IT ALWAYS RETURNS TRUE 
     if (LL1.getVisibility()==View.GONE) show_line(tv4, 1000); 
} 

public void show_line (final TextView tv, int duration) { 
     try { 
      Thread.sleep(duration); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     tv.getHandler().post(new Runnable() { 
      public void run() { 
       tv.setVisibility(View.VISIBLE); 
      } 
     }); 
     /*tv.setVisibility(View.VISIBLE); CANT USE THIS BECAUSE IM NOT IN UI THREAD*/ 
} 

public void btnLL (final LinearLayout LL, Button btnLeft, Button btnRight, final TextView tvLeft, final TextView tvRight) { 

     //LL.setVisibility(View.VISIBLE); AGAIN NOT IN UI THREAD 
     LL.getHandler().post(new Runnable() { 
      public void run() { 
       LL.setVisibility(View.VISIBLE); 
      } 
     }); 

     btnLeft.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       LL.getHandler().post(new Runnable() { 
        public void run() { 
         LL.setVisibility(View.GONE); 
        } 
       }); 
       tvLeft.getHandler().post(new Runnable() { 
        public void run() { 
         tvLeft.setVisibility(View.VISIBLE); 
        } 
       }); 
      } 
     }); 

     btnRight.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       LL.getHandler().post(new Runnable() { 
        public void run() { 
         LL.setVisibility(View.GONE); 
        } 
       }); 
       tvRight.getHandler().post(new Runnable() { 
        public void run() { 
         tvRight.setVisibility(View.VISIBLE); 
        } 
       }); 

      } 
     }); 
} 
+0

なぜあなたはthreadとpost()を使用していますか?すべての操作はUIスレッドで行う必要があるため、すべてを削除できます。GONEからVISIBLEへの遷移を遅らせたい場合は、アニメーション – GVillani82

+0

を使用してください。1)このアンドロイドのすべてに新しいものを入れてください:) 2)私はあなた自身のスレッドを使うべきだと読んでいます 3)この場合アニメーションをどのように使いますか? 4)実際のアプリでここに投稿した内容のほうがずっと多いでしょう 5)スレッドを使用しない場合はどうすればスリープを使用できますか? 6)私はまだこのコードの問題を理解したいと思うでしょう。 7)もっと良いオプションは、メソッドを同期することです! (同期/待機/通知) – Nemanja

+0

OK、私は「プリミティブ」ソリューションでこれを解決しましたが、誰かがこのコードを修正する方法を知っていて、なぜこのIFが機能しないのかを記入してください私の知識のギャップ:) 私は同期でこれを解決しようとする前に、グローバル 'boolean x = false;を宣言し、最後に両方のボタンの' onClick'に 'x = true;'を追加しました私は 'while(!x){}'を空のループとして使っていましたので、 'btnLL()'メソッドからのアクションを待っていました。 'show_line()'メソッドの先頭に 'if(x == true)x = false;を追加しました。 – Nemanja

答えて

0

OK、私は私の「原始的」溶液でコメントを書き込みました。同じように、私は、問題を認識し、それをテストし、IFが機能しなかったことを理由:)を確認...

実行ステップ:
1 )show_line())はGONEから
2 VISIBLEになるbtnLL()はGONEから可視に取得し、そのonClick()
3で最大2つのボタンを設定します)これは、ユーザーがアプリと対話し、その選択をしなければならないところ、これは重要な部分
ですonClickが実行され、4)IF文が実行されます。
ユーザの操作の前にIF文が実行されているため、LL1はまだVISIBLEであったため、if (LL1.getVisible()==View.GONE)がfalseを返し、ユーザがボタンを押してLL1がGONEに切り替わり、IFは既に実行され、もっと。

0
//THIS IS THE PROBLEM IT ALWAYS RETURNS TRUE 
    if (LL1.getVisibility()==View.GONE) show_line(tv4, 1000); 

最も可能性が高い私の活動です。

あなたはこのようなもので、そのチェックを配置する必要があります:LL1はgetVisibility()をチェックする前に、/可視化されるのを待ちます

LL1.getHandler().post(new Runnable() { 
     public void run() { 
      if (LL1.getVisibility()==View.GONE) show_line(tv4, 1000); 
     } 
    }); 

注:GVillani82のように、スレッドや投稿を不必要に使用しています。 Thread mainThread = new Thread()(そしてそれに加えて、view.getHandler().post())は、ほんの一部だけview.post()を必要としません。

+0

これはまだ動作しません。 IF文は明らかにfalseを返します。 UIスレッドでこれを行うと、アンドロイドスタジオは、AVDを実行すると、UIスレッドがあまりにも多くあり、このコードは必要な部分のほんの一部であることを通知します – Nemanja