2016-06-11 2 views
0

저는 안드로이드 개발을 처음 사용하고 있으며 프레임 워크의 작동 방식을 이해하는데 어려움이 있습니다. 나는 간단한 경험을 얻기 위해 간단한 게임을 만들려고 노력하며 아래에 도움을 요청하고 싶다. 내 주요 활동에는 내 게임에서 다양한 데이터를 표시 할 수있는 TextView가 몇 개 있으며 그 아래에는 게임 자체에 대한 개체를 그리는 캔버스가있는 AnimatedView라는 사용자 지정보기가 있습니다. 캔버스에있는 객체를 기반으로 TextViews를 업데이트하여 예를 들어 표시하고 싶습니다. 오브젝트 수, 플레이어 레벨 등.사용자 정의보기에서 안드로이드 UI 업데이트

아래 코드로 TextView 오브젝트를 얻을 수 있지만 textView.setText (...)를 호출하면 아무 것도 변경되지 않습니다. UI.

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 
} 
MainActivity.java

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    ... 
    tools:context="com.danielsh.test.teststuff.MainActivity" 
    android:orientation="vertical"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/myTextView" 
     android:text="Change this!" /> 

    <com.danielsh.test.teststuff.AnimatedView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/animView" /> 

</LinearLayout> 

:

아래 내 실제 코드의 단순화 된 버전, 문제를 설명하는 것입니다

AnimatedView.java

public class AnimatedView extends View { 
    public AnimatedView(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     final Handler uiHandler = new Handler(); 
     final Runnable runnable = new Runnable() { 
      public void run() { 
       LayoutInflater inflater = LayoutInflater.from(getContext()); 
       LinearLayout layout = (LinearLayout) inflater.inflate(R.layout.activity_main, null, false); 
       TextView textView = (TextView) layout.findViewById(R.id.myTextView); 
       textView.setText("" + (System.currentTimeMillis()/1000)); 
       textView.invalidate(); 
      } 
     }; 

     uiHandler.postDelayed(runnable, 1000); 
    } 
} 

나는 내가 UI에 볼 수있어 실제 텍스트 뷰 객체로 작업 아니에요 가정,하지만 확실하지 뭐라고 그 일을 올바른 방법이 될 수.

동일한 문제를 다루는 기존 게시물에 대한 도움말이나 포인터는 많은 도움이됩니다.

+0

텍스트를 설정 한 후에'textView.invalidate();'를 시도 했습니까? –

+0

@SatyenUdeshi textView.invalidate(); 나를 위해 차이를 만들지 않습니다. –

+0

@tynn handler.postDelayed()는 실제로 더 좋으며, 불행히도 같은 문제가 있습니다. –

답변

0

AnimatedView으로 무엇을하려하는지 명확하지 않습니다. 따라서 문제가있는 경우에만 올바르게 작동하는 방법에 대한 실질적인 해결책을 드릴 수 없습니다. 이것이 당신의 전체 구현이라면, 아마도 당신 자신의 행위 자체에서 그 행위를 구현하려고 시도해야 할 것입니다.

게시 한 Runnable에 XML에서 레이아웃을 확장했습니다. 이는 새로운 레이아웃과 뷰를 생성하고이를 로컬 변수에 할당한다는 것을 의미합니다. 이러한보기는 활동에 표시된 레이아웃 계층의 일부가 아닙니다. 따라서 TextView의 텍스트를 업데이트하면 어디에서도 변경 사항을 볼 수 없습니다.

새 설명 : Thread을 새로 만드는 대신 postDelayed(Runnable, long)을 사용하십시오.

+0

자세한 설명을 주셔서 감사합니다. 당신이 말한 것은 나의 가정을 확인해 주었고, 나는 올바른 시각으로 일하지 않고있다. 그래서 AnimatedView.java에서 activity_main.xml의 뷰에 액세스 할 수 있습니까? inflate를 사용하지 않으면 (예 :'TextView textView = (TextView) findViewById (R.id.myTextView);)'textView'는 항상 null입니다. –

+0

@DanielSH 만약'TextView'가'AnimatedView'의 뷰 계층의 일부가 아니라면, 전혀 접근하지 말아야합니다. 활동 범위 내에서 애니메이션을 구현하는 것을 고려하십시오. – tynn

+0

감사합니다. 이것은 유망합니다. MainActivity.java에서 업데이트를 수행하도록 코드를 리팩터링했지만 어떤 이유로 UI 업데이트 코드가 한 번만 실행됩니다. 샘플을 업데이트했습니다. 무엇이 잘못되었는지 보시겠습니까? –