将我的应用程序转换为Fragments:如何处理活动?

时间:2013-03-08 18:33:57

标签: android android-layout android-fragments

我打算将现有的Android应用程序转换为片段布局。

我们的想法是拥有经典的两个面板布局(左侧是项目列表,右侧是详细信息)。

实际上,该应用程序由4个活动组成:

  1. 具有所有可用选项的ChoiceListActivity
  2. 3种不同的活动,每种活动对应一种工具。
  3. 现在我开始进行转换,我创建了一个FragmentActivity类,这是主类:

        public class MainFragment extends FragmentActivity {
    
        private static final String TAG = "MainFragment";
    
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.fragment_main);
            if(findViewById(R.id.fragment_container)!=null){
                Log.i(TAG, "No Tablet");
                Intent i = new Intent(MainFragment.this, main.ChoiceActivity.class);
                startActivity(i);
            } else {
                Log.i(TAG, "Tablet");
            }
        }
    }
    

    我创建了一个ChoiceListFragment: `

    public class ChoiceListFragment extends ListFragment {
    
        @Override
        public void onListItemClick(ListView l, View v, int position, long id) {
            Toast.makeText(getActivity(), getListView().getItemAtPosition(position).toString(), Toast.LENGTH_LONG).show();
            super.onListItemClick(l, v, position, id);
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);     
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            String[] options = getResources().getStringArray(R.array.listitems);
            ArrayAdapter<String> adapter = new ArrayAdapter<String>(inflater.getContext(), R.layout.list_item, options);
            setListAdapter(adapter);
            return super.onCreateView(inflater, container, savedInstanceState);
        }
    
    }
    

    该片段将位于面板的左侧。

    我的问题是为了正确的一面。这个想法是,对于列表的每个元素,将显示相应的活动(或片段?)。

    那么正确的方法是什么?

    1. 当用户选择项目时,最好在正确的片段中启动活动吗?

    2. 或者我必须以编程方式在片段之间切换?以及如何做到这一点(我找到了许多教程,但他们总是使用相同的活动来改变其中的一些数据)?

    3. 我为正确的片段创建了以下类(但我不确定我是否正确地执行了此操作):

      public class RightFragment extends Fragment {
      
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
      
          }
      
          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup container,
                  Bundle savedInstanceState) {        
              return inflater.inflate(R.layout.main, container, false);
          }
      
      
      }
      

      我注意到我最终可以在onCreate方法中使用LayoutInflater对象更改布局,但这只是简单地在屏幕上布局,布局中声明的对象未初始化(也没有添加eventListener等)。那怎么办呢?

      也许我应该创建一个Intent并使用startActivity来启动现有的活动,或者这是一个坏主意片段?

      实际上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="horizontal" >
      
          <fragment
              android:id="@+id/choicelist_fragment"
              android:name="main.fragments.ChoiceListFragment"
              android:layout_width="0dp"
              android:layout_height="match_parent"
              android:layout_weight="1" />
      
          <fragment
              android:id="@+id/right_fragment"
              android:name="main.fragments.RightFragment"
              android:layout_width="0dp"
              android:layout_height="match_parent"
              android:layout_weight="2" />
      
      </LinearLayout> 
      

2 个答案:

答案 0 :(得分:1)

好的,我发现自己是解决方案,在第一时间不清楚,但阅读一些文档,看了很多教程,也许我明白它是如何工作的。

首先,我从布局中删除了第二个片段* right_fragment *(检查问题),我用一个名为* activity_container *的空FrameLayout替换它,它将是我片段的容器。

背后的想法是使用FragmentManager替换容器内的片段。

所以我将 onListItemClick 方法更新到ChoiceListFragment中,并根据点击的列表项,它创建一个新的Fragment并将其替换为* activity_container *。更新的方法类似于以下内容:

public void onListItemClick(ListView l, View v, int position, long id) {            
        String itemName = getListView().getItemAtPosition(position).toString();
        switch(position){
        case OPTION_ONE:                getFragmentManager().beginTransaction().replace(R.id.activity_container, new OptionOneFragment()).commit();
            break;
        case RESISTOR_VALUE:
            getFragmentManager().beginTransaction().replace(R.id.activity_container, new OptionTwoFragment()).commit();
            break;
        default:
            Toast.makeText(getActivity(), getListView().getItemAtPosition(position).toString(), Toast.LENGTH_LONG).show();
            break;
        }       
        super.onListItemClick(l, v, position, id);
    }

这样,应用程序的每个组件都有自己的片段,由不同的类处理。

答案 1 :(得分:0)

你走在正确的轨道上。在小屏幕上,单击列表项会启动DetailActivity,它是DetailFragment的简单包装器。在更大的屏幕上,单击列表项将使用新的DetailFragment实例替换右侧。

如果您正在使用eclipse和ADT,我建议您查看MasterDetailFlow模板,可以通过创建新的Android项目或新的Android Activity来访问该模板。