2016-07-21 16 views
0

Ich habe zwei Layouts table.xml (port) und table.xml (Land), die von dort einen Namen der Landschaft und andere für die Protrait.auf der Orientierungsänderung Taste touchlistener funktioniert nicht

enter image description here

Ich habe dieses Layout in einem anderen fragment_test.xml wie folgt aufgerufen Layout enthalten:

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

    <include layout="@layout/table"/> 

    </RelativeLayout> 

und das ist mein Fragment-Code des oben Layout fragment_test:

public class Fragment_test extends Fragment implements View.OnTouchListener{ 
    @Override 
     public void onActivityCreated(Bundle savedInstanceState) { 
      super.onActivityCreated(savedInstanceState); 



     mytable= (LinearLayout) getActivity().findViewById(R.id.mytableid); 
     typeface = Typeface.createFromAsset(getActivity().getAssets(), "fonts/font.ttf"); 

        for (int i = 0; i < table1.getChildCount(); i++) { 
        LinearLayout mychild = (LinearLayout) mytable.getChildAt(i); 
        for (int j = 0; j < mychild.getChildCount(); j++) { 
         Button b = (Button) child.getChildAt(j); 
         b.setTypeface(typeface); 
         b.setOnTouchListener(this); 
        } 

       } 
      } 

     } 


     //this is called when a button is touched 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
    return true; 
    } 

} 

also im Grunde habe ich mehrere Tasten in der Tabelle Layout ich Schleife durch Settouchlistener für jede von ihnen. mein Problem ist also, wenn ich von Protrait zu Landscape umschalte oder umgekehrt der Touchlistener des Buttons nicht mehr funktioniert und auch die Schrift beim Layoutwechsel nicht mehr funktioniert.

> Edit: dies ist der Aktivitätscode

@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
     getSupportActionBar().setTitle("Home"); 


     FragmentManager manager = getFragmentManager(); 
     manager.beginTransaction().add(R.id.container, new Fragment_test(), "mytag").commit(); 




    } 
+0

Beitrag Aktivitätscode –

+0

i den Aktivitätscode hinzugefügt, aber ich glaube nicht, das ist im Zusammenhang, da ich den Code und das Fragment onActivityCreated gedebuggt wird normalerweise immer genannt, wenn ich die Orientierung – has19

+0

geändert Wo ist 'table1' herkommen, und was ist die Anzahl der Kinder bei jeder Rotation? –

Antwort

1

Versuchen setRetainInstance(true) nach super.onActivityCreated(savedInstanceState);

here is the documentation of setRetainInstance(boolean)

Aktivität Aufruf:

public class MainActivity extends AppCompatActivity { 

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

    FragmentManager manager = getSupportFragmentManager(); 
    Fragment myFragment = manager.findFragmentByTag("myFragment"); 
    if (myFragment == null) { 
     myFragment = new ParentFragment(); 
    } 

    manager.beginTransaction().add(R.id.fragmentHolder, myFragment, "myFragment").commit(); 
} 
} 

Fragm ent:

public class ParentFragment extends Fragment{ 

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    setRetainInstance(true); 
} 
} 
+0

hat es nicht funktioniert, – has19

+0

bitte posten Ihr @ Layout/Tisch. –

+2

@ has19 'setRetainInstance (true)' schlägt fehl, wenn Sie bei jedem Aufruf von onCreate eine neue Fragment-Instanz hinzufügen (jede Drehung). Suchen Sie in der Hosting-Aktivität das Fragment über sein Tag, wenn Null, erstellen Sie eine neue Instanz und beginnen Sie dann die Transaktion mit dem neuen Fragment oder der aktuellen Fragment-Instanz. –

0

Ich gebe Ihnen nur die Informationen.

können Sie die Orientataion des Geräts auf diese Weise überprüfen und Layout festlegen.

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    if (newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){ 
     setContentView(R.layout.table_horizontal); 
     button1 = (Button)findViewById(R.id.button1); 
     button1.setOnClickListener(this); 
    }else if (newConfig.orientation==Configuration.ORIENTATION_PORTRAIT){ 
     setContentView(R.layout.table_vertical); 
     button1 = (Button)findViewById(R.id.button1); 
     button1.setOnClickListener(this); 
    } 
} 
+0

aber dieser Code funktioniert nur für Aktivitäten nicht fragmentieren – has19