gpt4 book ai didi

java - 不要在旋转时加载相关的横向/纵向布局

转载 作者:行者123 更新时间:2023-12-01 13:38:37 26 4
gpt4 key购买 nike

我的 Android 应用程序遇到了非常令人不安的问题。我正在使用 fragment 。每个 fragment 都包含一个用于纵向 UI 和横向 UI 的单独 XML 文件。

如果我从 fragment “InputFragment”移动到 fragment “OutputFragment”,并且如果我现在旋转设备, fragment 将更改为“InputFragment<”/'!!这意味着,应用程序将返回到轮换的上一个 fragment !但是,这不应该发生。如果我在纵向模式下旋转设备,那么它应该调用同一 fragment 的横向 UI,反之亦然。

以下是代码。我只显示代码的结构,因为其他都是变量的声明和赋值等。

InputFragment.java

public class InputFragment extends Fragment {

//Declaring variables. CODE REMOVED




public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
//Intializing instance variables. CODE REMOVED

view = inflater.inflate(R.layout.input, container,false);



restoreStates(savedInstanceState);

return view;

}

//This method will save the instances
@Override
public void onSaveInstanceState(Bundle savedInstanceStateBundle)
{
super.onSaveInstanceState(savedInstanceStateBundle);

try{

}
catch(NullPointerException e)
{

}
}

//This method will restore the instances
@Override
public void onActivityCreated(Bundle savedInstanceStateBundle)
{
super.onActivityCreated(savedInstanceStateBundle);

if(savedInstanceStateBundle!=null)
{
}
}

//Action Listener for the Submit Bar
private class SubmitButtonAction implements OnClickListener
{

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
//Put the JSON. Calling to the JSON handling class. CODE REMOVED


} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

Fragment frag = new OutputFragment();

FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, frag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(null);
ft.commit();



}

}



private void restoreStates(Bundle savedInstanceStateBundle)
{
if(savedInstanceStateBundle!=null)
{

}
}




}

OutputFragment.Java

public class OutputFragment extends Fragment implements AsyncResponse{

//Delclaring variables. CODE REMOVED


public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
//Intializing instance variables. CODE REMOVED
view = inflater.inflate(R.layout.output, container,false);


return view;

}


//ActionListener for the manual back button
private class BackButtonAction implements OnClickListener
{

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
FragmentManager fm = getFragmentManager();
fm.popBackStackImmediate();

}

}


@Override
public void processFinish(String output) {
// TODO Auto-generated method stub
Log.d("OUTPUT_FRAGMENT", output);

try {





progressDialog.dismiss();

} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

}

MainActivity.java

    import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.Menu;
import android.view.Window;

public class MainActivity extends FragmentActivity {

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


Fragment frag = new InputFragment();

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, frag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(null);
ft.commit();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}



}

list 文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.xxx.xxx"
android:versionCode="1"
android:versionName="1.0" >

<uses-permission android:name="android.permission.INTERNET" />

<uses-sdk
android:minSdkVersion="11"
android:targetSdkVersion="18" />

<application
android:allowBackup="true"
android:icon="@drawable/xxx_logo"
android:label="@string/xxx"
android:theme="@style/AppTheme">
<activity
android:name="com.xxx.xxx.MainActivity"
android:configChanges="keyboardHidden|screenLayout|orientation|screenSize"
android:label="@string/xxx" >

</activity>
<activity
android:name="com.xxx.xxx.SplashScreen"
android:configChanges="keyboardHidden|screenLayout|orientation|screenSize"
android:label="@string/xxx" >

<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

</manifest>

经过几个小时的搜索,我找到了解决此问题的解决方案。也就是说,将代码 android:configChanges="keyboardHidden|screenLayout|orientation|screenSize" 添加到 Manifest 文件中。

现在, fragment 不会在旋转时移动到上一个 fragment ,但是,它也不会加载其他布局!这意味着,如果我将手机从纵向旋转为横向,它不会加载“横向”UI,反之亦然!它只是尝试调整自身以适应 View ,但这并不好,因为在不加载其他相关 UI 的情况下,图像和所有内容都会显示得很糟糕。这里发生了什么?

最佳答案

旋转后,您的 Activity 将被重新创建,并调用其 onCreate() 方法。您想要做的是检查该 Activity 是否是第一次启动,然后用 InputFragment 替换您的 fragment 。在 Activity 第一次创建时,savedInstanceState 为 null,因此您可以执行以下操作:

if(savedInstanceState == null) {
// replace fragment
}

编辑:

这就是 Activity 中的 onCreate() 的样子:

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

if(savedInstanceState == null) {
Fragment frag = new InputFragment();

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.replace(R.id.fragment_container, frag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(null);
ft.commit();
}
}

现在,方向更改 Activity 不会替换您的 fragment ,并且您不需要在 list 中设置任何属性

关于java - 不要在旋转时加载相关的横向/纵向布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21038117/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com