1

I-Fragment aufweisen, wobei I benutzerdefinierte Ansicht-Klasse (Dragger)Fragment Feld null nach einer Drehung

public class CanvasFragment extends Fragment { 

    private Dragger dragger; 

    public CanvasFragment() { 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRetainInstance(true); 
    } 

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

     dragger = (Dragger) rootView.findViewById(R.id.dragger); 

     int[] symbolIndex = {}; 

     dragger.setElementsArray(symbolIndex); 
     return rootView; 
    } 

    public void addIconToCanvas(int id){ 
     dragger.addIcon(id); 
    } 
} 

nennen, und ich habe ein weiteres Fragment mit RecyclerView und dem Adapter, in dem ich CanvasFragment's Methode addIconToCanvas() durch den Host anrufen Aktivität von CanvasFragment.

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHolder> { 

    private int[] data; 
    private Context context; 

    public static class ViewHolder extends RecyclerView.ViewHolder { 
     public ImageView itemView; 
     public ViewHolder(View v) { 
      super(v); 
      itemView = (ImageView) v.findViewById(R.id.im_item); 
     } 
    } 

    public ItemAdapter(Context context, int[] myDataset) { 
     data = myDataset; 
     this.context = context; 
    } 

    @Override 
    public ItemAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_view, parent, false); 
     ViewHolder vh = new ViewHolder(v); 
     return vh; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, final int position) { 
     holder.itemView.setImageResource(data[position]); 
     holder.itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
      ((MainActivity)context).addItemToCanvas(data[position]); 
      } 
     }); 
    } 

    @Override 
    public int getItemCount() { 
     return data.length; 
    } 
} 

fand ich, dass nach der Drehung dragger in CanvasFragment neue Referenz bekommt, aber wenn ich addIconToCanvas() von Adapter nennen - dragger ist null.

Ich kann wirklich nicht verstehen, warum und dann verlieren Referenzfeld wird)))

jemand weiß Ist, was daran falsch ist?

Vielen Dank im Voraus!

P. S .: Host Aktivität

public class MainActivity extends AppCompatActivity { 

    private CanvasFragment canvasFragment = new CanvasFragment(); 
    private ItemsFragment itemsFragment = new ItemsFragment(); 

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

     if (savedInstanceState == null) { 
      getSupportFragmentManager().beginTransaction() 
       .add(R.id.container_canvas, canvasFragment) 
       .commit(); 
      getSupportFragmentManager().beginTransaction() 
       .add(R.id.container_items, itemsFragment) 
       .commit(); 
     } 

    } 

    public void addItemToCanvas(int id){ 
     canvasFragment.addIconToCanvas(id); 
    } 

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

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 

     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 
} 
+0

bitte posten Sie –

+0

@ PhanVănLinh Adapter yeap! Eine Sekunde bitte! – micsha123

+0

Wenn Sie nicht drehen, funktioniert es richtig? –

Antwort

1

Mit der Linie

private CanvasFragment canvasFragment = new CanvasFragment();

weisen Sie eine neue Instanz des Fragment auf die Variable canvasFragment jedes Mal, wenn die Activity erstellt wird. Aber nur wenn savedInstanceState == null Sie diese Instanz von CanvasFragment der Benutzeroberfläche hinzufügen.

Die Fragment Methode onCreateView() wird nur, wenn der Fragment Bedarf aufgerufen wird gezeigt werden, so dragger bleibt null für die neu erstellte Instanz nach einer Konfigurationsänderung.

Was können Sie tun?

Erstellen Sie nur eine Instanz von CanvasFragment, wenn Sie sie zur Benutzeroberfläche hinzufügen möchten. In Fällen, in denen savedInstanceState != null finden, die bereits bestehende Fragment wie folgt aus:

canvasFragment = (CanvasFragment)getSupportFragmentManager().findFragmentById(R.id.container_canvas); 
+0

Perfekt! Wie kann ich diesen dummen Fehler verpassen ?! Mehh Vielen Dank, 0x0nosugar! – micsha123

0

put this:

androidConfigChanges: "keyboardHidden | orientation | screenSize" 

in Ihrem Android-xml-Datei, in die Sie Ihre mainActivity definiert ist. so etwas wie dieses

<activity 
android:name="com.projectname.MainActivity" 
android:label = "@string/title_activity_main" 
</activity> 

dann sollte es Glück wie folgt aus:

<activity 
android:name="com.projectname.MainActivity" 
androidConfigChanges: "keyboardHidden | orientation | screenSize" 
android:label = "@string/title_activity_main" 
</activity> 
+0

Sieht wie eine Umgehung aus – micsha123

+0

ja. aber es hilft mir, den Bezug auf alle erstellten Objekte auf dem Bildschirm zu halten –

1

Entfernen Sie die Zeile setRetainInstance (true); von deinen Fragmenten und versuche es.

+0

diese Zeile wurde nach dem ersten Absturz hinzugefügt. Es macht also keinen Unterschied – micsha123

+0

In der MainActivity ist savedInstanceState nicht Null nach der Änderung der Geräteausrichtung. Die Anweisungen in 'if check' werden also nicht nach der Geräteausrichtung ausgeführt. Kannst du bitte den vollständigen Code der Aktivität posten? – Bob

+0

Ich habe die Frage bearbeitet. Es gibt den vollständigen Code der Hostaktivität – micsha123

Verwandte Themen