【问题标题】:onCreateView() and onActivityCreated() in MyAddFragment class invokes a lot more than required by working with dynamic fragmentMyAddFragment 类中的 onCreateView() 和 onActivityCreated() 调用的内容比使用动态片段所需的要多得多
【发布时间】:2014-11-01 20:30:11
【问题描述】:

我是 android 应用程序开发的新手。我的应用程序有问题。我正在做一个简单的“待办事项列表应用程序”。当我将我的应用程序部署到 android 手机时。第一次运行良好。当我更改设备的方向时,MyAddFragment 中的 onCreateView() 和 onActivityCreated() 可以工作多个。并且“添加按钮”在更改方向后不起作用。 ****请帮我解决这个问题。

以下是我的活动和片段类和 xml 文件。

public class MainActivity extends Activity implements Communicator{
FragmentManager man;
private ArrayAdapter<String> todoArrayAdapter;
private ArrayList<String> todoItems;

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

    man = getFragmentManager();
    MyAddFragment f1 = new MyAddFragment();
    MyListFragment f2 = new MyListFragment();


    FragmentTransaction transaction = man.beginTransaction();
    transaction.add(R.id.frameLayout1, f1, "Add");
    transaction.add(R.id.frameLayout2, f2,"List");


    Log.i("a", "onCreate - ADDED FRAGMENT");
    if (savedInstanceState == null) {
        todoItems = new ArrayList<String>();

    }else {
        todoItems = savedInstanceState.getStringArrayList("veri");
    }

    todoArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,todoItems);
    f2.setListAdapter(todoArrayAdapter);
    transaction.commit();

}

public void respond(String data) {
    MyListFragment fb = (MyListFragment) man.findFragmentById(R.id.frameLayout2);
    todoItems.add(data);
    todoArrayAdapter.notifyDataSetChanged();
}

@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;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putStringArrayList("veri", todoItems);
}

}

public class MyAddFragment extends Fragment{
Button btnAdd;
EditText txtEdit;
Communicator comm;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_add, container,false);

    return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    btnAdd = (Button) getActivity().findViewById(R.id.btnAdd);
    txtEdit = (EditText) getActivity().findViewById(R.id.txtEdit);
    comm = (Communicator) getActivity();
    btnAdd.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            String newRecord = txtEdit.getText().toString();
            comm.respond(newRecord);
            txtEdit.setText("");
        }
    });
}

}

public class MyListFragment extends ListFragment {

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

    return view;
}

}

public interface Communicator {
public void respond(String data);

}

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.ceng389hw1.MainActivity" >

<FrameLayout
    android:id="@+id/frameLayout1"
    android:layout_width="fill_parent"
    android:layout_height="40dp"
    android:layout_alignParentLeft="true"
    android:background="#ab3e0f" >

</FrameLayout>

<FrameLayout
    android:id="@+id/frameLayout2"
    android:layout_width="fill_parent"
    android:layout_height="20dp"
    android:layout_alignParentBottom="true"
    android:layout_below="@+id/frameLayout1"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="10dp"
    android:background="#ab3eab"
   >

</FrameLayout>
</RelativeLayout>

fragment_add.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/RelativeLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" 
android:background="#ab3e0f">

 <Button
    android:id="@+id/btnAdd"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_alignParentTop="true"
    android:text="@string/btnStringAdd" />

<EditText
    android:id="@+id/txtEdit"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBottom="@+id/btnAdd"
    android:layout_alignParentLeft="true"
    android:layout_toLeftOf="@+id/btnAdd"
    android:ems="10"
    android:inputType="text" />

</RelativeLayout>

fragment_list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#ab5810" >

    <ListView
        android:id="@android:id/list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

【问题讨论】:

    标签: android android-layout android-fragments android-listfragment oncreate


    【解决方案1】:

    您应该更改应用程序中的两个文件。

    第一步,您应该在 androidmanifest 文件中添加以下代码。

    android:configChanges="orientation|screenSize"
    

    将代码添加到 Androidmanifest 后,您的 androidmanifes 文件必须如下所示。

    <activity
                android:name="com.example.ceng389hw1.MainActivity"
                android:configChanges="orientation|screenSize"
                android:label="@string/app_name" >
    

    第二步,你必须重写 onConfigurationChanged 函数,如下所示。

    @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
    
            // Checks the orientation of the screen
            if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
                Toast.makeText( this, "landscape", Toast.LENGTH_SHORT ).show();
            } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT){
                Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show();
            }
        }
    

    更多详情 -> http://developer.android.com/guide/topics/resources/runtime-changes.html#HandlingTheChange

    【讨论】:

      【解决方案2】:

      在您的主要活动中检查是否已在活动中添加片段。

      @Override
      protected void onCreate(Bundle savedInstanceState) {
      
      ...
      
      if(getFragmentManager().getFragment("Add")==null) {
      
      //initialize fragment, create transaction and commit
      
      }
      ...
      
      
      }
      

      【讨论】:

      • 首先,感谢您的关注和回答。不幸的是,它没有工作。MyAddFragment 中的 onCreateView() 和 onActivityCreated() 和 MyListFragment 中的 onCreateView 工作 multiple.onCreate 在 MainActivity 类中工作一次,但其他工作一次又一次我不明白为什么。此外“添加按钮”没有响应。
      【解决方案3】:

      您可以在 manifest.xml 中添加 configChanges 参数,它会让您在配置更改后忽略重新初始化,您可以这样做

      <activity
                  android:name="com.youractivity"
                  android:configChanges="orientation" />
      

      希望对你有帮助:)

      【讨论】:

      • 我添加了 configChanges 参数,但问题继续。按钮不起作用。我想添加在更改设备方向后发生的日志(ekranı çevirdikten sonraki loglardır):I/xx(22365):onCreate() - MainActivity I/xx(22365): onCreate() - 添加了 MyAddFragment I/xx(22365): onCreate() - 添加了 MyListFragment I/xx(22365): onCreateView() - MyListFragment I/xx(22365): onCreateView() - MyAddFragment I/xx(22365): onActivityCreated() - MyAddFragment I/xx(22365): onCreateView() - MyListFragment I/xx(22365): onCreateView() - MyAddFragment I/xx(22365): onActivityCreated() - MyAddFragment
      猜你喜欢
      • 1970-01-01
      • 2012-06-14
      • 1970-01-01
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      • 1970-01-01
      相关资源
      最近更新 更多