gpt4 book ai didi

当设备的方向改变时,带有 fragment 的 android Activity 退出

转载 作者:行者123 更新时间:2023-11-29 16:09:35 27 4
gpt4 key购买 nike

我的应用包含一个 Activity ,该 Activity 由两个 fragment 组成。第一个 fragment 是通过 XML 添加的,第二个 fragment 是根据第一个 fragment 的输入动态添加的。该应用程序在模拟器上完美运行。但是,当在真实设备(三星 galaxy 选项卡)上进行测试时,应用程序会在更改设备方向时简单地退出(不会崩溃,也不会出现任何错误)。我正在使用安卓 4.0.我搜索了很多这个问题并尝试了本网站和其他网站提供的各种解决方案,但问题仍然存在。我还想补充一点,我的应用程序不使用 fragment 的版本在两个方向上都可以正常工作。

主布局文件(activity_main.xml)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical" >

<fragment
android:name="androiapps.autoqos.FirstFragment"
android:id="@+id/fragment"
android:layout_weight="2"
android:layout_width="fill_parent"
android:layout_height="0dp"
/>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_weight="1"
android:layout_height="0dp"
android:orientation="vertical"
android:id="@+id/frameLayout" >

</FrameLayout>
</LinearLayout>

MainActivity.java

public class MainActivity extends FragmentActivity implements OnInputReceivedListener, MessageSendListener{
//variable declarations

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

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

@Override
public void onConfirm(Bundle bundle) {
// TODO Auto-generated method stub
if(bundle!=null){
//int PT = bundle.getInt("PT");
System.out.println("Got:"+bundle.getString("ip")+bundle.getString("port")+bundle.getString("tcpip")
+bundle.getString("tcpport")+bundle.getInt("PT",0));
udpHost=bundle.getString("ip");
udpPort=bundle.getString("port");
tcpHost=bundle.getString("tcpip");
tcpPort=bundle.getString("tcpport");
pType=bundle.getInt("pType",0);
FragmentManager fragmentManager = getSupportFragmentManager();
MessageFragment fragment = new MessageFragment();
fragment.setArguments(bundle);
FragmentTransaction transaction = fragmentManager.beginTransaction();
transaction.replace(R.id.frameLayout, fragment);
transaction.commit();
}
}

@Override
public void send(Bundle bundle) {
// TODO Auto-generated method stub
if(bundle==null)
return;

msg = bundle.getString("msg");
delay = bundle.getInt("delay",0);
System.out.println("Got: "+msg+delay);
startTransmission();
}
void startTransmission(){
System.out.println("\nTrying to send data");
sendFilter = new IntentFilter(UdpResponseReceiver.ACTION_RESP1);
sendFilter.addCategory(Intent.CATEGORY_DEFAULT);
receiver1 = new UdpResponseReceiver();
receiveFilter = new IntentFilter(UdpHandlerReceiver.ACTION_RESP2);
receiveFilter.addCategory(Intent.CATEGORY_DEFAULT);
receiver2 = new UdpHandlerReceiver();
registerReceiver(receiver1, sendFilter);
registerReceiver(receiver2, receiveFilter);
udpServiceIntent = new Intent(MainActivity.this,UdpSendService.class);
udpReceiveIntent = new Intent(MainActivity.this,UdpReceiveService.class);
udpServiceIntent.putExtra("host",udpHost);
udpServiceIntent.putExtra("port", udpPort);
udpServiceIntent.putExtra("msg",msg);
udpServiceIntent.putExtra("delay",delay);
udpServiceIntent.putExtra("pType",pType);
startService(udpServiceIntent);
udpReceiveIntent.putExtra("tcpHost", tcpHost);
udpReceiveIntent.putExtra("tcpPort", tcpPort);
startService(udpReceiveIntent);
}
public class UdpResponseReceiver extends BroadcastReceiver {
public static final String ACTION_RESP1 = "com.example.udpmessageclient.intent.action.MESSAGE_PROCESSED";
@Override
public void onReceive(Context context, Intent intent) {

// Update UI, new "message" processed by SimpleIntentService
System.out.println(intent.getStringExtra(UdpSendService.PARAM_OUT_MSG));

}
}
public class UdpHandlerReceiver extends BroadcastReceiver {
public static final String ACTION_RESP2 = "com.example.udpmessageclient.intent.action.MESSAGE_RECEIVED";
@Override
public void onReceive(Context context, Intent intent) {

// Update UI, new "message" processed by SimpleIntentService
System.out.println("Received message from server: "+intent.getStringExtra(UdpReceiveService.OUT_MSG));

}
}

@Override
public void stop() {
// TODO Auto-generated method stub
endTransmission();
Button btn = (Button)findViewById(R.id.btn_confirm);
btn.setEnabled(true);

}
void endTransmission(){
UdpSendService.send=false;
if(receiver1!=null && receiver2!=null){
unregisterReceiver(receiver1);
unregisterReceiver(receiver2);
receiver1=null;
receiver2=null;
}
//while(stopService(udpReceiveIntent)!=true);
if(udpReceiveIntent!=null)
stopService(udpReceiveIntent);
System.out.println("\nreceive service stopped");
//while(stopService(udpServiceIntent)!=true);
if(udpServiceIntent!=null)
stopService(udpServiceIntent);
System.out.println("\nsend service stopped");
return;
}
@Override
public void onBackPressed() {
if(UdpSendService.send)
stop();
finish();

}
@Override
public void onStop() {
super.onStop();
stop();
finish();
}

}

FirstFragment.java

public class FirstFragment extends Fragment{
//variable declarations
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View contentView = inflater.inflate(R.layout.activity_message_form, null);
contentView.setDrawingCacheEnabled(false);
text1 = (EditText) contentView.findViewById(R.id.ip);
text2 = (EditText) contentView.findViewById(R.id.port);
text3 = (EditText) contentView.findViewById(R.id.tcpip);
text4 = (EditText) contentView.findViewById(R.id.tcpport);
if(onSaveInstance!=null){
text1.setText(onSaveInstance.getString("ip"));
text2.setText(onSaveInstance.getString("port"));
text3.setText(onSaveInstance.getString("tcpip"));
text4.setText(onSaveInstance.getString("tcpport"));
}
button= (Button) contentView.findViewById(R.id.btn_confirm);
rb1 = (RadioButton) contentView.findViewById(R.id.rbtn_1);
rb2 = (RadioButton) contentView.findViewById(R.id.rbtn_2);
rb3 = (RadioButton) contentView.findViewById(R.id.rbtn_3);
rb4 = (RadioButton) contentView.findViewById(R.id.rbtn_4);
confirmButtonListener = new OnClickListener(){
public void onClick(View view){
button.setEnabled(false);
if (rb1.isChecked())
PT = 0;
else if (rb2.isChecked())
PT = 1;
else if (rb3.isChecked())
PT = 2;
else if (rb4.isChecked())
PT = 3;
else
PT = 0;
ip = text1.getText().toString().trim();
port = text2.getText().toString().trim();
tcpip=text3.getText().toString().trim();
tcpport=text4.getText().toString().trim();
if(ip=="" || port=="" || tcpip == "" || tcpport ==""){
Toast.makeText(getActivity(), "Please fill in all the fields", Toast.LENGTH_SHORT).show();
}
else{
Bundle b = new Bundle();
b.putString("ip",ip);
b.putString("port", port);
b.putString("tcpip",tcpip);
b.putString("tcpport", tcpport);
b.putInt("pType", PT);

if ( listener != null ){
System.out.println("Bundle:"+ip+port+tcpip+tcpport+PT);
listener.onConfirm(b);
}
}
}
};
return contentView;
}
@Override
public void onStart(){
super.onStart();
button.setOnClickListener(confirmButtonListener);
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
try {
listener = (OnInputReceivedListener)activity;
}catch (ClassCastException e) {
Toast.makeText( activity, "Activity must implement this interface.", Toast.LENGTH_SHORT).show();
}
}
public interface OnInputReceivedListener{
public void onConfirm(Bundle bundle);
}
@Override
public void onPause(){
super.onPause();
onSaveInstance = new Bundle();
onSaveInstance.putString("udpHost", ip);
onSaveInstance.putString("udpPort", port);
onSaveInstance.putString("tcpHost", tcpip);
onSaveInstance.putString("tcpPort", tcpport);

}
@Override
public void onResume(){
super.onResume();
if(onSaveInstance!=null){
text1.setText(onSaveInstance.getString("ip"));
text2.setText(onSaveInstance.getString("port"));
text3.setText(onSaveInstance.getString("tcpip"));
text4.setText(onSaveInstance.getString("tcpport"));
}
}
}

MessageFragment.java

public class MessageFragment extends Fragment{
//variable declarations
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View contentView = inflater.inflate(R.layout.activity_message, null);
contentView.setDrawingCacheEnabled(false);
msgText = (EditText) contentView.findViewById(R.id.msg);
sendBtn = (Button) contentView.findViewById(R.id.btn_send);
stopBtn = (Button) contentView.findViewById(R.id.btn_stop);
if(onSaveInstance!=null){
msgText.setText(onSaveInstance.getString("msg"));
delayField.setText(onSaveInstance.getInt("delay", 0));
}
b = getArguments();
System.out.println("PT="+b.getInt("pType",0));
if(b!=null){
int pType = b.getInt("pType");
if(pType==1 || pType== 3){
delayField = (EditText) contentView.findViewById(R.id.delay);
tvDelay = (TextView) contentView.findViewById(R.id.tvDelay);
tvDelay.setVisibility(View.VISIBLE);
delayField.setVisibility(View.VISIBLE);
}
}
sendButtonListener=new OnClickListener(){

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
sendBtn.setEnabled(false);
Bundle b = new Bundle();
msg=msgText.getText().toString();
delay=Integer.parseInt(delayField.getText().toString());
b.putString("msg", msg);
if(delayField!=null)
b.putInt("delay",delay);
if(mListener!=null)
mListener.send(b);
}
};
stopButtonListener = new OnClickListener(){

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
sendBtn.setEnabled(true);
mListener.stop();
}
};
return contentView;
}
@Override
public void onStart(){
super.onStart();
sendBtn.setOnClickListener(sendButtonListener);
stopBtn.setOnClickListener(stopButtonListener);
}
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
try {
mListener = (MessageSendListener)activity;
}catch (ClassCastException e) {
Toast.makeText( activity, "Activity must implement this interface.", Toast.LENGTH_SHORT).show();
}
}
public interface MessageSendListener{
public void send(Bundle bundle);
public void stop();
}
@Override
public void onPause(){
super.onPause();
onSaveInstance = new Bundle();
onSaveInstance.putString("msg", msg);
onSaveInstance.putInt("delay", delay);
}
@Override
public void onResume(){
super.onResume();
if(onSaveInstance!=null){
msgText.setText(onSaveInstance.getString("msg"));
delayField.setText(onSaveInstance.getInt("delay", 0));
}
}
}

最佳答案

public void onStop() {
super.onStop();
stop();
finish();

为什么要完成()?您的应用程序完全按照您编写的代码执行。当方向改变时,调用 onStop()。然后你finish()你的 Activity 。

关于当设备的方向改变时,带有 fragment 的 android Activity 退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14625532/

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