2016-01-09 6 views
1

Я пытаюсь весь день устанавливать текст в текстовые фрагменты из фрагмента. Я попытался сделать это без адаптера, но теперь я пытаюсь использовать его с адаптером. В этот момент он сбой и дает мне NullPointerException в следующей строке FragmentManager fm = ((NieuwToevoegen)context).getFragmentManager();, но я уверен, что это будет не единственная проблема. В моем приложении я хочу разместить различные кадры в соответствии с вашими данными. И в соответствии с количеством кадров, я получил разные строки для текстовых просмотров. Впервые я работаю с фрагментами.Адаптер для изменения текста в фрагменте не работает

Если кто-то знает лучший способ сделать это, пожалуйста, скажите мне.

Моя активность

public class NieuwToevoegen extends AppCompatActivity { 
    Button buttonVerstuur; 
    FragmentManager fm = getFragmentManager(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.nieuw_toevoegen); 
     buttonVerstuur = (Button) findViewById(R.id.buttonVerstuur); 

     buttonVerstuur.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       TextView aantalTxt = (TextView) findViewById(R.id.txtAantal); 
       aantalTxt.setEnabled(false); 
       int aantal = Integer.parseInt(aantalTxt.getText() + ""); 
       Log.d("onclickButtonVerstuur", aantal + ""); 
       tekstFragmentAdapter adapter = new tekstFragmentAdapter(NieuwToevoegen.this,aantal); 

      }});} 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      // Respond to the action bar's Up/Home button 
      case android.R.id.home: 
       goBack(); 
       return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    private void goBack(){ 
     super.onBackPressed(); 
     Intent i = new Intent(NieuwToevoegen.this, startScherm.class); 
     Log.d("backbutton", i + ""); 
     startActivity(i); 
    } 

    @Override 
    public void onBackPressed() { 
     goBack(); 
    } 

    public void addFragment(int id) { 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.add(id, new fragmentItem()); 
     Log.d("addfragment", ft+""); 
     ft.commit(); 
    } 

Мой адаптер

public class tekstFragmentAdapter extends ArrayAdapter<tekstFragment> { 
    private Context context; 
    private Integer aantal; 

     public tekstFragmentAdapter(Context context, int aantalFr) { 
      super(context, 0, aantalFr); 
      aantal=aantalFr; 
     } 
     FragmentManager fm = ((NieuwToevoegen)context).getFragmentManager(); 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 


      if (convertView == null) { 
       convertView = LayoutInflater.from(getContext()).inflate(R.layout.fragment_item_layout, parent, false); 
      } 

      TextView tekst1 = (TextView) convertView.findViewById(R.id.textView1); 
      TextView tekst2 = (TextView) convertView.findViewById(R.id.textView2); 
      TextView tekst3 = (TextView) convertView.findViewById(R.id.textView3); 

      switch(aantal) { 
       case 1: 
        tekst1.setText("@string/een_item1_string"); 
        addFragment(R.id.frameLayout1); 
        break; 
       case 2: 
        tekst1.setText("@string/twee_item1_string"); 
        tekst2.setText("@string/twee_item2_string"); 
        addFragment(R.id.frameLayout1); 
        addFragment(R.id.frameLayout2); 
        break; 
       case 3: 
        tekst1.setText("@string/drie_item1_string"); 
        tekst2.setText("@string/drie_item2_string"); 
        tekst3.setText("@string/drie_item3_string"); 
        addFragment(R.id.frameLayout1); 
        addFragment(R.id.frameLayout2); 
        addFragment(R.id.frameLayout3); 
        break; 
       default: 
        TextView aantalIngevuld = (TextView) convertView.findViewById(R.id.txtAantal); 
        aantalIngevuld.setEnabled(true); 

        break;} 

      return convertView; 
     } 
    public void addFragment(int id) { 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.add(id, new fragmentItem()); 
     Log.d("addfragment", ft + ""); 
     ft.commit(); 
    } 
    } 

Фрагмент XML

<?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="fill_parent"> 
    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="100dp" 
     android:gravity="center_horizontal" 
     android:layout_margin="20dp" 
     android:id="@+id/frameLayout1"> 

    <ImageButton 
     android:layout_width="120dp" 
     android:layout_height="100dp" 
     android:scaleType="fitXY" 
     android:id="@+id/imageButton1" 
     android:layout_gravity="center_horizontal" 
     android:src="@drawable/gallery_icon" 
     android:background="#00000000"/> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="" 
      android:id="@+id/textView1" /> 
    </FrameLayout> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="100dp" 
     android:gravity="center_horizontal" 
     android:layout_margin="20dp" 
     android:id="@+id/frameLayout2"> 

     <ImageButton 
      android:layout_width="120dp" 
      android:layout_height="100dp" 
      android:scaleType="fitXY" 
      android:id="@+id/imageButton2" 
      android:layout_gravity="center_horizontal" 
      android:src="@drawable/gallery_icon" 
      android:background="#00000000" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="" 
      android:id="@+id/textView2" /> 
    </FrameLayout> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="100dp" 
     android:gravity="center_horizontal" 
     android:layout_margin="20dp" 
     android:id="@+id/frameLayout3"> 

     <ImageButton 
      android:layout_width="120dp" 
      android:layout_height="100dp" 
      android:scaleType="fitXY" 
      android:id="@+id/imageButton3" 
      android:layout_gravity="center_horizontal" 
      android:src="@drawable/gallery_icon" 
      android:background="#00000000" /> 

     <TextView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="" 
      android:id="@+id/textView3" /> 
    </FrameLayout> 


</LinearLayout> 

tekstFragment содержит только следующие

public class tekstFragment { 
    private String tekst; 

    public tekstFragment(String tekst) { 
     this.tekst = tekst; 
    } 


    public String getTekst() { 
     return tekst; 
    } 
} 

Струны Я пытаюсь добавить

<string name="drie_item1_string">Voeg een foto toe van een pull/sweater/jas</string> 
<string name="drie_item2_string">Voeg een foto toe van een t-shirt/top</string> 
<string name="drie_item3_string">Voeg een foto toe van een rok/short/broek</string> 
<string name="twee_item1_string">Voeg een foto toe van een pull/sweater/jas</string> 
<string name="twee_item2_string">Voeg een foto toe van een kleedje/broekpak/playsuit</string> 
<string name="een_item1_string">Voeg een foto toe van een kleedje/broekpak/playsuit</string> 

ответ

1

исправить нулевую проблему указателя Exception

public class tekstFragmentAdapter extends ArrayAdapter<tekstFragment> { 
    private Context context; 
    private Integer aantal; 
    FragmentManager fm; 
     public tekstFragmentAdapter(Context context, int aantalFr) { 
      super(context, 0, aantalFr); 
      aantal=aantalFr; 
      this.context= context 
      fm = ((NieuwToevoegen)context).getFragmentManager(); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 


      if (convertView == null) { 
       convertView = LayoutInflater.from(getContext()).inflate(R.layout.fragment_item_layout, parent, false); 
      } 

      TextView tekst1 = (TextView) convertView.findViewById(R.id.textView1); 
      TextView tekst2 = (TextView) convertView.findViewById(R.id.textView2); 
      TextView tekst3 = (TextView) convertView.findViewById(R.id.textView3); 

      switch(aantal) { 
       case 1: 
        tekst1.setText("@string/een_item1_string"); 
        addFragment(R.id.frameLayout1); 
        break; 
       case 2: 
        tekst1.setText("@string/twee_item1_string"); 
        tekst2.setText("@string/twee_item2_string"); 
        addFragment(R.id.frameLayout1); 
        addFragment(R.id.frameLayout2); 
        break; 
       case 3: 
        tekst1.setText("@string/drie_item1_string"); 
        tekst2.setText("@string/drie_item2_string"); 
        tekst3.setText("@string/drie_item3_string"); 
        addFragment(R.id.frameLayout1); 
        addFragment(R.id.frameLayout2); 
        addFragment(R.id.frameLayout3); 
        break; 
       default: 
        TextView aantalIngevuld = (TextView) convertView.findViewById(R.id.txtAantal); 
        aantalIngevuld.setEnabled(true); 

        break;} 

      return convertView; 
     } 
    public void addFragment(int id) { 
     FragmentTransaction ft = fm.beginTransaction(); 
     ft.add(id, new fragmentItem()); 
     Log.d("addfragment", ft + ""); 
     ft.commit(); 
    } 
    } 

но почему вы Отдавая свой контекст с Activtiy NieuwToevoegen, просто поставить контекст в качестве параметра к вашему адаптеру

+0

попробуйте удалить исключение нулевого указателя, и если у вас есть другие проблемы, оставьте комментарий, удачи – Netero

+0

он исправил исключение нулевого указателя, но он ничего не делает прямо сейчас. Он не доходит до моего переключателя. Я думал, что должен был отдать его, потому что я пишу его в своем адаптере вместо своей активности NieuwToevoegen? Я только новичок в андроиде, и до сих пор это не так. –

+0

может объяснить, чего вы пытаетесь достичь, это то, что я понимаю до сих пор: пользователь ввел текст (справа?) В ваше приложение и нажал кнопку, и в соответствии с тем, что он поставил, вы показываете текст и несколько фрагментов (зачем добавлять несколько фрагментов?), пожалуйста, отредактируйте свой ответ с большим количеством объяснений, и я постараюсь помочь вам достичь того, что вы хотите сделать, bests – Netero

1

Я предпочел опубликовать другой ответ, потому что он не будет связан с первым, я положу код структуры и продолжу в зависимости от Ваши потребности:

package my.game.androidstarter; 
import android.R; 
import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentTransaction; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 

public class NieuwToevoegen extends Activity { 

    Button buttonVerstuur; 
    EditText editTextInput; // so user could insert a text from 1 to 3 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.nieuw_toevoegen); 
     buttonVerstuur = (Button) findViewById(R.id.buttonVerstuur); 
     editTextInput = (EditText) findViewById(R.id.yourEditText); // add your edit text in your xml layout "nieuw_toevoegen" 
     editTextInput.setEnabled(false); 

     buttonVerstuur.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       int aantal = Integer.parseInt(editTextInput.getText().toString()); // get the number input inserted by user 
       Log.d("onclickButtonVerstuur", aantal + ""); 
       callFragment(aantal); 

      }});} 

    private void callFragment(int aantal) { 

      switch (aantal) { 
      case 1: 
       YourCustomFragment1 fragment = new YourCustomFragment1(); // if 1 --> your custom fragment one 

       break; 
      case 2: 
       YourCustomFragment2 fragment = new YourCustomFragment2(); // if 2 --> your custom fragment two 

       break; 
      case 3: 
       YourCustomFragment3 fragment = new YourCustomFragment3(); // if 2 --> your custom fragment three 

       break; 
      default: 
       // TODO if user insert a number that is not 1 or 2 or 3 (and he can do thant) 
       break; 

      } 

      // charge the fragment that was created depending on input number 
      FragmentManager fragmentManager = getSupportFragmentManager(); 
      fragmentManager.beginTransaction() 
      .replace(R.id.frame_container, fragment).commit(); // You should have frame_container (frame layout) defined in your nieuw_toevoegen.xml 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 


    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      // Respond to the action bar's Up/Home button 
      case android.R.id.home: 
       goBack(); 
       return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 

    private void goBack(){ 
     super.onBackPressed(); 
     Intent i = new Intent(NieuwToevoegen.this, startScherm.class); 
     Log.d("backbutton", i + ""); 
     startActivity(i); 
    } 

    @Override 
    public void onBackPressed() { 
     goBack(); 
    } 

Теперь все, что вам нужно сделать, это создать три различные фрагменты Cutom (класс, который расширяет Fragment), а затем настроить каждые фрагменты по-разному с макетом, вид, кнопками, изображением ....

надеюсь, что это было достаточно ясно!

+0

Я не думал сделать 3 фрагмента, спасибо. Я попробую и ответю позже. –

+0

Теперь он работает благодаря вам. Но по какой-то странной причине мой заголовок ушел, поэтому я не могу нажать на значок назад. В остальном он отлично работает. –

+0

хорошо для вас Наоми, строка состояния, которая уходит во фрагмент, я предполагаю, что ничего странного просто не входит в xml активности и не проверяет ли фрагмент-фрагмент (содержимое фрагмента) строку состояния, если у вас есть проблемы исправить это просто положить файл xml;), удачи для вашего исследования – Netero