私のテストコードアプリでは、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);
}
});
}
});
}
なぜあなたはthreadとpost()を使用していますか?すべての操作はUIスレッドで行う必要があるため、すべてを削除できます。GONEからVISIBLEへの遷移を遅らせたい場合は、アニメーション – GVillani82
を使用してください。1)このアンドロイドのすべてに新しいものを入れてください:) 2)私はあなた自身のスレッドを使うべきだと読んでいます 3)この場合アニメーションをどのように使いますか? 4)実際のアプリでここに投稿した内容のほうがずっと多いでしょう 5)スレッドを使用しない場合はどうすればスリープを使用できますか? 6)私はまだこのコードの問題を理解したいと思うでしょう。 7)もっと良いオプションは、メソッドを同期することです! (同期/待機/通知) – Nemanja
OK、私は「プリミティブ」ソリューションでこれを解決しましたが、誰かがこのコードを修正する方法を知っていて、なぜこのIFが機能しないのかを記入してください私の知識のギャップ:) 私は同期でこれを解決しようとする前に、グローバル 'boolean x = false;を宣言し、最後に両方のボタンの' onClick'に 'x = true;'を追加しました私は 'while(!x){}'を空のループとして使っていましたので、 'btnLL()'メソッドからのアクションを待っていました。 'show_line()'メソッドの先頭に 'if(x == true)x = false;を追加しました。 – Nemanja