2012-07-04 2 views
0

EDIT: Вот новый код, который вы предложили:программно создавать поля EditText в фрагменте из SeekBar

package com.mwerner.mycalc.finance; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.view.ViewGroup.LayoutParams; 
import android.widget.EditText; 
import android.widget.LinearLayout; 
import android.widget.SeekBar; 
import android.widget.SeekBar.OnSeekBarChangeListener; 
import android.widget.TextView; 

public class F_NPV extends Fragment { 

    EditText[] DynamicField = new EditText[16]; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
      return inflater.inflate(R.layout.npv, container, false); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

    final LinearLayout linearLayout = (LinearLayout)getActivity().findViewById(R.id.npv_calcfields); 
    EditText editText = new EditText(getActivity()); 
    final int i = 0; 
    editText.setId(i); //Set id so that you can remove that EditText in the future. 
    editText.setLayoutParams(new LayoutParams(
      LayoutParams.FILL_PARENT, 
      LayoutParams.WRAP_CONTENT)); 
    linearLayout.addView(editText); 
    SeekBar bar = (SeekBar) getActivity().findViewById(R.id.npv_seekbar); 
    final TextView selection = (TextView) getActivity().findViewById(R.id.npv_selected); 

    bar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 

     public void onProgressChanged(SeekBar seekbar, int progress, 
       boolean fromUser) { 
      // to display to the user how many he has selcted 
      selection.setText("You chose " + progress + "periods"); 
      if (i > progress) { 
       i--; 
       EditText editText = (EditText) getActivity().findViewById(i); 
       linearLayout.removeView(editText); 
      } 

      else { 
       EditText editText = new EditText(getActivity()); 
       editText.setId(i); 
       editText.setHint("EditText No: " + (i+1)); 
       editText.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 
       linearLayout.addView(editText); 
       i++; 
      } 
     } 
     public void onStopTrackingTouch(SeekBar seekbar) {} 
     public void onStartTrackingTouch(SeekBar arg0) {} 
    }); 
} 
} 

EDIT 2:

Я установил «отставание» в сокращении числа полей, когда я слайд вниз быстро.

bar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() { 
    public void onProgressChanged(SeekBar seekbar, int progress, 
     boolean fromUser) { 
     // to display to the user how many he has selcted 

     selection.setText("You chose " + progress + "periods"); 
     if (i > progress) { 
      while (i > progress) { 
       i--; 
       EditText editText = (EditText) getActivity().findViewById(i); 
       linearLayout.removeView(editText); 
      } 
     } 

     else { 
      while (i < progress) { 
       EditText editText = new EditText(getActivity()); 
       editText.setId(i); 
       editText.setHint("EditText No: " + (i+1)); 
       editText.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 
       linearLayout.addView(editText); 
       i++;  
      } 
     } 
    } 
    public void onStopTrackingTouch(SeekBar seekbar) {} 
    public void onStartTrackingTouch(SeekBar arg0) {} 
}); 

Теперь мне нужно сделать то же математическую операцию с каждым полем:

answer = entry/(Math.pow(1+r , i) 

в основном каждая запись получает делится на (1+r) к власти Ид, что это поле имеет ... так что первый текстовое редактирование делится на (1+r)^0, второе поле делится на (1+r)^1 и т. д. Как мне это сделать?

Edit 3:

calc.setOnClickListener(new OnClickListener() { 

     public void onClick(View arg0) { 
     Double r1 = Double.parseDouble(r.getText().toString()); 
     EditText editText = (EditText) getActivity().findViewById(i); 
     TextView answer = (TextView) getActivity().findViewById(R.id.npv_answer); 
     double[] CashFlows; 
     CashFlows = new double[i]; 
     double result = 0; 
     for (int i1 = 0; i1 < i; i1++) { 
      CashFlows[i] = (Double.parseDouble(editText.getText().toString()))/(Math.pow(1+r1, i)); 

     } 

     for(double d : CashFlows) { 
      result += d; 
     } 

     answer.setText("answer is " + result); 
     } 
    }); 

В основном это был мой мыслительный процесс. Скажите, пожалуйста, где я ошибся, потому что это приводит к сбою при загрузке fragment.

Моя идея была

Double r1 используется в математике TextView answer используется для вывода окончательного ответа

EditText editText является то, что вы сказали мне, что мне нужно ссылаться на это

Теперь я понял, я 'd поместить все значения, которые пользователь вводит в заданные поля в массив, а также сделать простую математику для всех из них. Это то, для чего первый цикл цикла. Затем, когда этот массив будет выполнен, я решил, что добавлю их все вместе, так как это то, что я хочу. Я нашел код для «Для каждого» цикла здесь

http://www.leepoint.net/notes-java/flow/loops/foreach.html

Тогда, когда все это подытожили он должен быть одним дубля в переменном результате ... то я бы просто установить текст, который номер ...

Где я ошибаюсь?

ответ

3

Вы можете создать 2 макета в вашем XML-файле, например, 2 линейных макета или что угодно.

В первом макете добавить Seekbar самостоятельно.

Получите второй макет по id из кода Java и программно добавьте/удалите TextView во второй макет при каждом изменении хода.

Это может быть сделано следующим образом:

Сначала получите второй макет как этот

LinearLayout linearLayout = (LinearLayout)getActivity().findViewById(R.id.npv_calcfields); 

Второму добавить EditText:

EditText editText = new EditText(this); 
editText.setId(i); //Set id so that you can remove that EditText in the future. 
editText.setLayoutParams(new LayoutParams(
     LayoutParams.FILL_PARENT, 
     LayoutParams.WRAP_CONTENT)); 
linearLayout.addView(editText); 

Edit: Нижеследующая является рабочим пример:

public void onProgressChanged(SeekBar seekBar, int progress, 
     boolean fromUser) { 
    if (i > progress) { 
     i--; 
     EditText editText = (EditText) findViewById(i); 
     linearLayout.removeView(editText); 
    } 
    else { 
     EditText editText = new EditText(SeekBarActivity.this); 
     editText.setId(i); 
     editText.setHint("EditText No: " + (i+1)); 
     editText.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT)); 
     linearLayout.addView(editText); 
     i++; 
    } 
} 

Надеюсь, я помог вам. ;)

+0

немного кода для добавления помогло бы, но я могу понять, что один из моих собственных с разработчиком docs :) Спасибо, это решение кажется действительно интуитивно понятным и хорошим :) – Killerpixler

+0

ОК я не могу понять это, пожалуйста, помогите, я обновил его, как видно выше, а также отступы и прочее не работайте либо – Killerpixler

+0

@Killerpixler Извините за мой поздний ответ :) Я обновил свой ответ с помощью некоторого кода для вас. –

0

просто создать LinearLayout в xml..like это

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    > 


    <ScrollView 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:fillViewport="true" 
     > 
    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" 
     > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/family_detail_linear" 
     android:orientation="vertical" 
     ></LinearLayout> 
    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/family_detail_addbutton" 
     android:text="Add More" 
     /> 

</LinearLayout> 
    </ScrollView> 

</LinearLayout> 

и обнаружили, что LinearLayout в вашем fragment

public class MyFrag extends Fragment{ 


    private Button addmoremember; 
    private Activity activity; 
    private LinearLayout layout; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.family_details, container, false); 

     activity=getActivity(); 
     addmoremember=(Button)rootView.findViewById(R.id.family_detail_addbutton); 
     layout=(LinearLayout)rootView.findViewById(R.id.family_detail_linear); 
     addmoremember.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       EditText edttexname= new EditText(activity); 
       edttexname.setHint("Enter Name"); 

       layout.addView(edttexname); 

      } 
     }); 

     return rootView; 
    } 
}