2013-08-07 4 views
0

저는 Android 앱 (Eclipse에서 Java)을 사용하고 있고 Shift 키를 사용하여 키보드의 일부 버튼 텍스트를 변경하고 싶습니다. 모든 사람들이 비슷한 질문을하는 것처럼 텍스트 뷰 텍스트를 변경 한 것과 동일한 코드를 구현했지만 어떤 이유로 그것이 작동하지 않을 것입니다. 어떤 이유로 다른 버튼 기능을 테스트 한 후에 버튼의 속성을 변경하는 것과 관련하여 나에게별로 좋지 않은 무언가가 있다고 판단했습니다. 프로젝트 청소를 시도했지만 도움이되지 않았습니다. 호출 예외가 계속 발생합니다. 여기에 관련 코드는 다음과 같습니다 아래버튼 속성이 변경되지 않습니다

public class MainActivity extends Activity { 

    boolean shift = true; 
    static Vector<String> answer = new Vector<String>(1, 1); 
    static int ansLength = 0; 
    private TextView answerbox; 
    private Button a; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     initializeButtons(); 
     setContentView(R.layout.activity_main); 
     answerbox = (TextView) findViewById(R.id.answerbox); 

    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

    public void initializeButtons() { 
     a = (Button) findViewById(R.id.a); 

    } 

    public void typeKey(View sender) { 
     Button pressed = (Button) sender; 
     answer.add(ansLength, (String) pressed.getText()); 
     //answerbox.setText("test string"); 
     ansLength++; 
     StringBuilder stringBuilder = new StringBuilder(); 
     for (String string : answer) { 
      stringBuilder.append(string); 
     } 

     answerbox.setText(stringBuilder.toString()); 

    } 

    public void backSpace(View sender) { 

     answer.remove(ansLength - 1); 
     ansLength--; 
     StringBuilder stringBuilder = new StringBuilder(); 
     for (String string : answer) { 
      stringBuilder.append(string); 
     } 
     answerbox.setText(stringBuilder.toString()); 
    } 

    public void shift(View sender) { 
     if (shift == true) { 
      shift = false; 
      a.setText("l"); 
     } 
    } 
} 

XML :

<Button 
      android:id="@+id/a" 
      style="?android:attr/buttonStyleSmall" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" 
      android:layout_alignParentLeft="true" 
      android:text="A" 
      android:onClick="typeKey"/> 
<Button 
      android:id="@+id/shift1" 
      style="?android:attr/buttonStyleSmall" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentTop="true" 
      android:text="^" 
      android:textSize="24sp" 
      android:onClick="shift" /> 
+0

가지고 속성을 변경 한 후에보기를 무효화합니까? –

+0

AndroidAnnotations http://androidannotations.org/ 사용을 고려하십시오. 보일러 플레이트 코드를 줄이고 초기화 오류를 줄이는 데 좋은 도구입니다. 누락되거나 엉망이 된 경우에도 알려줍니다. – allprog

답변

1

첫째, initializeButtons()에서 findViewById() 따라서 setContentView()

, 이동하기 전에 Activity 객체에는 레이아웃 데이터가 없기 때문에 setContentView() 후에 호출되어야한다 성명서는 다음과 같습니다 :

super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    initializeButtons(); // Move this. 
    answerbox = (TextView) findViewById(R.id.answerbox); 

두 번째로, 은 특별한 목적을 제외하고 자바로 Vector을 사용하지 말라고 조언하고 싶습니다. 대신 ArrayList을 사용하십시오. Java의 벡터는 느리고 거의 지원되지 않습니다. 호환성 문제로 인해 사용할 수 있습니다.

static Vector<String> answer = new Vector<String>(1, 1); 

static ArrayList<String> answer = new ArrayList<String>(1, 1); 

당신이 동기화 문제가있는 경우, (나는 당신이 지금이 문제를 생각하지 않는다)로 교체해야합니다 후 사용에는 Collections.synchronizedList() 메소드 : Why is Java Vector class considered obsolete or deprecated?

관련 문제