在方向更改按钮上,touchlistener 不工作
On orientation change button touchlistener not working
我有两个布局 table.xml(港口)和 table.xml(土地),其中一个命名为景观,另一个命名为 protrait。
我已将此布局包含在另一个名为 fragment_test.xml 的布局中,如下所示:
<?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>
这是我上面布局的片段代码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;
}
}
所以基本上我在 table 布局中有几个按钮,我正在为每个按钮循环到 setontouchlistener。
所以我的问题是当我从 protrait 切换到 landscape 或相反时,按钮的 touchlistener 不再工作,甚至在更改布局时字体也不再工作。
> 编辑: 这是 activity 代码
@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();
}
尝试在 super.onActivityCreated(savedInstanceState);
之后调用 setRetainInstance(true)
here is the documentation of setRetainInstance(boolean)
Activity :
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();
}
}
片段:
public class ParentFragment extends Fragment{
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);
}
}
我只是给你信息。
您可以通过这种方式查看设备的 Orientataion
并设置布局。
@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);
}
}
我有两个布局 table.xml(港口)和 table.xml(土地),其中一个命名为景观,另一个命名为 protrait。
我已将此布局包含在另一个名为 fragment_test.xml 的布局中,如下所示:
<?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>
这是我上面布局的片段代码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;
}
}
所以基本上我在 table 布局中有几个按钮,我正在为每个按钮循环到 setontouchlistener。
所以我的问题是当我从 protrait 切换到 landscape 或相反时,按钮的 touchlistener 不再工作,甚至在更改布局时字体也不再工作。
> 编辑: 这是 activity 代码
@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();
}
尝试在 super.onActivityCreated(savedInstanceState);
setRetainInstance(true)
here is the documentation of setRetainInstance(boolean)
Activity :
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();
}
}
片段:
public class ParentFragment extends Fragment{
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);
}
}
我只是给你信息。
您可以通过这种方式查看设备的 Orientataion
并设置布局。
@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);
}
}