2011-08-07 5 views
0

"소득 추가"및 "소득 공제"를 기준으로 "순 수입"수를 계산하는 응용 프로그램을 작성하고 있습니다. 두 가지 레이아웃이 있습니다. 하나는 태블릿 용이고 다른 하나는 휴대 전화 용입니다. 태블릿 버전은 훨씬 상세한 설문지를 보여 주며 전화 버전은 더 짧은 형식을 보여줍니다.포함보기의 하위보기에서 키를 누를 때 알림을 수신하는 방법

"긴 형식"의 XML은 다음과 같습니다. 이 게시물에 대해 TableRows를 여러 개 가져 왔는데, XML을 자주 사용하고 싶지 않았기 때문입니다. 그것 이외에, 이것은 정확하게 내가 사용하고있는 것입니다. (두 개의 테이블이 나란히 있습니다.) 계산은 단지 소득에 모두 추가를 addes 별도의 클래스에서 수행하는

<?xml version="1.0" encoding="utf-8"?> 
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:id="@+id/input_layout" 
    > 
    <TableLayout android:layout_height="wrap_content" android:id="@+id/tableLayout0" android:layout_width="fill_parent"> 
     <TableRow android:layout_width="wrap_content"> 

      <!-- Table appearing on left side prompting for additions to income --> 
     <TableLayout android:layout_height="wrap_content" android:id="@+id/tableLayout1" android:layout_width="fill_parent"> 
      <TableRow android:id="@+id/tableRow0" android:layout_width="wrap_content"> 
       <TextView android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_height="wrap_content" android:id="@+id/textView1" android:text="@string/income"></TextView> 
      </TableRow> 
      <TableRow android:id="@+id/tableRow1" android:layout_width="wrap_content" android:layout_height="wrap_content"> 
       <TextView style="@style/leftIndentText" android:id="@+id/textView2" android:text="@string/gross_income"></TextView> 
       <EditText style="@style/NumericInput" android:id="@+id/textGrossIncome"> 
        <requestFocus></requestFocus> 
       </EditText> 
      </TableRow> 
      <TableRow> 
       <TextView style="@style/leftIndentText" android:text="@string/pay_frequency"/> 
       <Spinner style="@style/Spinner" 
        android:id="@+id/PayFrequency" 
        android:entries="@array/pay_frequency_choices"/> 
      </TableRow> 
      <TableRow android:id="@+id/tableRow2" android:layout_width="wrap_content" android:layout_height="wrap_content"> 
       <TextView style="@style/leftIndentText" android:id="@+id/textView3" android:text="@string/investment_income"></TextView> 
       <EditText style="@style/NumericInput" android:id="@+id/textInvestmentIncome"></EditText> 
      </TableRow> 
     </TableLayout> 

      <!-- Table appearing on rightside prompting for deductions from income --> 
      <TableLayout> 
      <TableRow> 
       <TextView android:layout_width="wrap_content" android:textAppearance="?android:attr/textAppearanceMedium" android:layout_height="wrap_content" android:id="@+id/textView1" android:text="@string/deductions"></TextView> 
      </TableRow> 
      <TableRow android:id="@+id/tableRow4" android:layout_width="wrap_content" android:layout_height="wrap_content"> 
       <TextView style="@style/leftIndentText" android:id="@+id/textView3" android:text="@string/unreimb_bus_exp"></TextView> 
       <EditText style="@style/NumericInput" android:id="@+id/textUnreimbBusExp"></EditText> 
      </TableRow> 
      </TableLayout> 
      </TableRow> 
     </TableLayout> 
</ScrollView> 

는 소득 공제를 뺀 순을 제공합니다. 사용자가 입력 필드를 떠날 때마다 대답을 계산하는 클래스를 업데이트해야합니다. 그래서 필자의 큰 비전은 각 입력 필드에 onFocusChangeListener를 첨부하는 것이 었습니다.

내가 직면 한 문제는 다음과 같습니다. 내가하고 싶은 일은 각 EditText보기에서 onFocusChangeListener를 명시 적으로 설정하지 않아도 EditText보기에서 포커스를 잃었을 때 알림을받는 방법을 찾는 것입니다. 내 추론은이 응용 프로그램이 개별 국가의 법률을 다루며 각 주마다 다른 입력이 있다는 것입니다. 그들은 모두 소득에 추가 및 공제를 위해 종기가 있습니다.

나는 안드로이드 개발자 포럼과이 사이트에서 온갖 경험을 쌓아 왔으며, 어떻게해야할지 모르겠다. 내가 작동하지 않는 아래로 내려간 경로는 EditText 뷰를 포함하는 TableView에서 onFocusChangeListener를 설정하는 것이지만 작동하도록 가져 오지 못했습니다.

즉, 내가 그이 조각이 작성되는과보기 팽창 때, 나는 그 시점에서 콜백을 추가하려고 노력하는 방법,

public class InputFragment extends Fragment 
{ 
    @Override 
    public View onCreateView(LayoutInflater inflator, ViewGroup container, Bundle savedInstanceState) 
    { 
     View view = inflator.inflate(R.layout.input_fragment_layout, container, false); 
     View table = view.findViewById(R.id.tableLayout0); 

     try 
     { 
      table.setFocusable(true); 
      table.setOnFocusChangeListener(new OnFocusChangeListener() 
      { 
       @Override 
       public void onFocusChange(View v, boolean hasFocus) 
       { 
        Log.e("TJD1", "Focus change event"); 
       } 

      }); 
     } 
     catch (Exception e) 
     { 
      Log.e("TJD1", "Error: " + e.toString()); 
     } 

     return view; 
    } 
} 

또한 고려 글고 치기의 각을 반복하려고 조각이 생성 될 때 뷰를 가져 오지만 그 중 하나를 수행하는 방법을 알 수는 없습니다.

올바른 방향의 포인터는 매우 유용합니다. 고맙습니다.

답변

0

덕분에, 내 게시물에 다음과 같은 해결책을 함께하고 공유하기를 원해요 , 레이아웃 XML에서 각 입력 필드의 ID 문자열을 변경했습니다.

<EditText style="@style/NumericInput" android:id="@+redinc/textSSI"></EditText> 

대신 "ID"를 사용하는, 내가 사용하는 것이 존재의 차이 "redinc : 지금은이를 사용하고, 대신

<EditText style="@style/NumericInput" android:id="@+id/textSSI"></EditText> 

예를 들어, 나는 이런 식으로 뭔가를 사용했다 "(소득 감소의 경우) 또는 소득 추가의 경우"addinc ".

내 조각에서 Java의 Reflection API를 사용하여 R.redinc 및 R.addinc 정적 클래스의 멤버를 찾을 수 있습니다. 이를 통해 코드가 모든 특정 컨트롤의 ID를 미리 알 필요없이 모든 컨트롤을 반복 할 수있게되어 다른 상태 및 다른 장치 형식에 대해이 응용 프로그램의 다른 버전을 구현하는 데 도움이됩니다. 내 새 단편이 이렇게 생겼어. (BTW : Focus는 올바른 이벤트가 아닐 수도 있지만이 예제에서는 초점이 맞춰져 있습니다.)

public class InputFragment extends Fragment 
{ 
    @Override 
    public View onCreateView(LayoutInflater inflator, ViewGroup container, Bundle savedInstanceState) 
    { 
     Log.e("TJD1", "InputFragment View Created"); 
     View view = inflator.inflate(R.layout.input_fragment_layout, container, false); 

     Field[] fields = R.addinc.class.getDeclaredFields(); 
     addHandlers(fields, view); 

     fields = R.redinc.class.getDeclaredFields(); 
     addHandlers(fields, view); 

     return view; 
    } 

    private void addHandlers(Field[] fields, View view) 
    { 
     for (Field field : fields) 
     { 
      Log.e("TJD1", "Adding focus handler for " + field.getName()); 
      try 
      { 
       View input = view.findViewById(field.getInt(null)); 
       input.setOnFocusChangeListener(new OnFocusChangeListener() 
       { 

        @Override 
        public void onFocusChange(View v, boolean hasFocus) 
        { 
         String comment = hasFocus ? " gained focus" : " lost focus"; 
         Log.e("TJD1", v.toString() + comment); 
        } 
       }); 
      } 
      catch (IllegalArgumentException e) 
      { 
       Log.e("TJD1", e.getLocalizedMessage()); 
      } 
      catch (IllegalAccessException e) 
      { 
       Log.e("TJD1", e.getLocalizedMessage()); 
      } 
     } 

    } 
} 
0

위대한 비전은 각 입력 필드에 onFocusChangeListener를 첨부하는 것이 었습니다.

데스크톱이나 노트북에서 의미가있을 수 있습니다. 터치 스크린이 지배하는 장치에서 사용자는 다른 필드로 자주 "탭"하지 않습니다. 어쨌든 다시 계산하기 위해 무언가를 탭해야하기 때문에 초점이 다르게 변경되지는 않습니다. 다시 계산할 항목을 누르게 할 수도 있습니다. 재 계산 버튼과 출력 필드를 ScrollView 외부에두면 단추와 결과가 한 번 탭 될 것입니다.

나는 각 EditText보기에서 onFocusChangeListener를 명시 적으로 설정하지 않아도 EditText보기가 포커스를 잃었을 때 알림을받는 방법을 찾아 냈습니다.

마일 길이 양식을 만들려면 길이가 긴 양식에 대한 프로그래밍이 필요합니다.

일을하지 않은 내가 내려 가서 경로는,의는 EditText 뷰가 들어있는 TableView에 onFocusChangeListener을 설정하는 것입니다,하지만 난 그게 작동시킬 수 없었다.

TableView; TableLayout 또는 TableRow을 의미한다고 가정합니다. 두 경우 모두 위젯은 초점을 맞추지 않기 때문에 포커스를 얻지 못합니다.

또한 조각이 만들어 질 때 각 EditText보기를 반복하는 것으로 생각했지만 그 방법도 알 수 없습니다.

위젯 ID를 사용하여 배열을 만듭니다. 배열을 반복합니다. 루프 내부에서 findViewById()으로 전화하여 위젯을 가져 오십시오.

첫째 경우 다른 사람이 비슷한 문제에 직면하고 이것보다 더 나은 솔루션을 가지고 올 수 없습니다에 @CommonsWare에 대한

+0

응답 해 주셔서 대단히 감사합니다. 내 특정 사용자층에게는 추가적인 조치를 취하는 것이 장벽인데, 그들은 재판 중에 변호사가되는 경향이 있습니다. 배열이 응용 프로그램에 하드 코드 된 ID의 배열을 만드는 것은 제가 질문에 언급 한 이유 때문에 비상업적 인 것입니다. 그러나 ID 배열을 사용하라는 제안은 내가 게시 한 솔루션을 생각하는 데 도움이되었습니다. 신속한 대응과 솔루션에 대한 영감을 주신 것에 대해 다시 한번 감사드립니다! – TJDJD

+0

확인. ** 게시됩니다 **. 새로운 사용자로서 나는 또 다른 5 시간 동안 "자기 대답"을 할 수 없다. 그러나이 솔루션에는 입력 필드의 ID 이름이 변경되어 R 클래스에는 입력 필드 만이 포함 된 새로운 정적 클래스가 있습니다. 이 작업을 수행하면서 Java의 리플렉션 API를 사용하여 반복 할 수있는 뷰 목록을 가져 왔으며 이벤트 처리기를 등록 할 수 있습니다. 이 방법을 사용하면 레이아웃 XML을 변경하면 나머지 응용 프로그램도 자동으로 피드됩니다. 유연한 솔루션에 대한 영감을 주신 @CommonsWare에게 다시 한 번 감사드립니다. – TJDJD

+0

"내 특정 사용자층에게 추가적인 조치를 취하는 것은 장벽이며 재판 중에 변호사가되는 경향이 있습니다." - 추가 단계가 없습니다. 그들은 버튼을 누르거나 초점을 강제로 바꾸기 위해 완전히 무의미한 다른 EditText를 탭합니다. 탭은 탭입니다. – CommonsWare

관련 문제