2017-03-07 69 views
0

我想用两个片段,其中一个包含组的列表(称为OverviewFragment)和一个包含选定组的详细信息(称为DetailsFragment)的片段来制作应用程序。我只想要一个片段在纵向模式下可见,并且两个横向模式都可以同时看到。在横向布局中复制Android片段中的textview

我有两个问题。首先,纵向和横向之间的过渡非常不稳定,并导致各种崩溃,即:空白屏幕,“未找到视图”,“错误膨胀类片段”和“重叠渲染”。

我的另一个更具体的问题是,在横向模式下,包含组名称的textview被复制并添加到布局顶部。对我来说这很奇怪,因为其他的textview(包含组信息)不会被重复。非常迷惑!

单独在肖像模式下运行应用程序效果不错,我没有崩溃或重复的文字浏览。

MainActivity.java

package com.example.o2k.lab2naviedition; 

import android.net.Uri; 
import android.support.v4.app.FragmentTransaction; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity implements OverviewFragment.OnOverviewInteractionListener, DetailsFragment.OnDetailsInteractionListener{ 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     if (savedInstanceState != null) { // if we are being restored we dont need to do stuff 
      System.out.println("saved"); 
      return; 
     } 
     System.out.println("tag is: "+findViewById(R.id.activity_main).getTag()); 

     if (findViewById(R.id.activity_main).getTag().equals("portrait")) { 
      OverviewFragment overFrag = new OverviewFragment(); 
      System.out.println("PORTRAIT IF ---------------------"); 
      // Add the fragment to the 'fragment_container' FrameLayout 
      getSupportFragmentManager().beginTransaction() 
        .add(R.id.fragment_container, overFrag).commit(); 

     } else if (findViewById(R.id.activity_main).getTag().equals("landscape")) { 
      System.out.println("LANDSCAPE IF ---------------------"); 
      FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
      transaction.replace(R.id.overview_fragment, new OverviewFragment()); 
      transaction.replace(R.id.details_fragment, new DetailsFragment()); 
      transaction.commit(); 
     } 
    } 

    @Override 
    public void onOverviewInteraction(int position) { 
     DetailsFragment detailsFrag = (DetailsFragment) 
       getSupportFragmentManager().findFragmentById(R.id.details_fragment); 

     Group group = OverviewFragment.getGroups()[position]; 
     DetailsFragment newFragment = new DetailsFragment(); 
     Bundle args = new Bundle(); 
     args.putString("groupName", group.getName()); 
     args.putString("groupInfo", group.getInfo()); 
     newFragment.setArguments(args); 
     FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 

     if (detailsFrag != null) { 
      transaction.replace(R.id.details_fragment, newFragment); 
     } else { 
      transaction.replace(R.id.fragment_container, newFragment); 
      transaction.addToBackStack(null); 
     } 
     transaction.commit(); 
    } 

    @Override 
    public void onDetailsInteraction(Uri uri) { 

    } 
} 

activity_main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:configChanges="keyboardHidden|orientation|screenSize" 
    android:id="@+id/activity_main" 
    android:tag="portrait" 
    tools:context="com.example.o2k.lab2naviedition.MainActivity"> 

    <FrameLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:id="@+id/fragment_container"> 
    </FrameLayout> 

</LinearLayout> 

activity_main.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:configChanges="keyboardHidden|orientation|screenSize" 
    android:orientation="horizontal" 
    android:id="@+id/activity_main" 
    android:tag="landscape"> 

    <fragment android:name="com.example.o2k.lab2naviedition.OverviewFragment" 
     android:id="@+id/overview_fragment" 
     android:layout_weight="1" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" /> 

    <fragment android:name="com.example.o2k.lab2naviedition.DetailsFragment" 
     android:id="@+id/details_fragment" 
     android:layout_weight="2" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" /> 

</LinearLayout> 

OverviewFragment.java

package com.example.o2k.lab2naviedition; 

import android.content.Context; 
import android.os.Bundle; 
import android.support.v4.app.ListFragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

import java.util.ArrayList; 
import java.util.List; 

public class OverviewFragment extends ListFragment { 

    private OnOverviewInteractionListener mListener; 
    private static Group[] groups = {new Group("group 1", "5"), new Group("group 2", "13"), 
      new Group("group 3", "12"), new Group("group 4", "32"), new Group("group 5", "45")}; 

    public OverviewFragment() { 
    } 

    public static OverviewFragment newInstance(String param1, String param2) { 
     OverviewFragment fragment = new OverviewFragment(); 
     Bundle args = new Bundle(); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     int layout = android.R.layout.simple_list_item_1; 
     List<String> groupNames = new ArrayList(); 
     for (Group g: groups 
      ) { 
      groupNames.add(g.getName()); 
     } 
     setListAdapter(new ArrayAdapter<String>(getActivity(), layout, groupNames)); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     return inflater.inflate(R.layout.fragment_overview, container, false); 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     mListener.onOverviewInteraction(position); 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof OnOverviewInteractionListener) { 
      mListener = (OnOverviewInteractionListener) context; 
     } else { 
      throw new RuntimeException(context.toString() 
        + " must implement OnOverviewInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    public interface OnOverviewInteractionListener { 
     void onOverviewInteraction(int position); 
    } 

    public static Group[] getGroups() { 
     return groups; 
    } 
} 

DetailsFragment.java

package com.example.o2k.lab2naviedition; 

import android.content.Context; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class DetailsFragment extends Fragment { 

    private OnDetailsInteractionListener mListener; 
    private String groupName; 
    private String groupInfo; 

    public DetailsFragment() { 
    } 

    public static DetailsFragment newInstance() { 
     DetailsFragment fragment = new DetailsFragment(); 
     Bundle args = new Bundle(); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View v = inflater.inflate(R.layout.fragment_details, container, false); 
     TextView groupNameTextView = (TextView)v.findViewById(R.id.groupNameText); 
     TextView groupInfoTextView = (TextView)v.findViewById(R.id.groupInfoText); 
     if (this.getArguments() != null) { 
      groupName = this.getArguments().getString("groupName"); 
      groupInfo = this.getArguments().getString("groupInfo"); 
     } else { 
      groupName = "<emptyNAME>"; 
      groupInfo = "<emptyINFO>"; 
     } 
     groupInfoTextView.setText("No of members: "+groupInfo); 
     groupNameTextView.setText(groupName); 
     return v; 
    } 

    @Override 
    public void onAttach(Context context) { 
     super.onAttach(context); 
     if (context instanceof OnDetailsInteractionListener) { 
      mListener = (OnDetailsInteractionListener) context; 
     } else { 
      throw new RuntimeException(context.toString() 
        + " must implement OnDetailsInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    public interface OnDetailsInteractionListener { 
     void onDetailsInteraction(Uri uri); 
    } 
} 
+0

为什么在一种情况下,你调用'add',在另一个'replace'中? –

+0

首先,在纵向和横向模式下使用片段容器的名称会更好。并阅读“保留片段”。第二次提供完整的错误日志。看起来像你试图添加一个片段两次。 –

+0

尝试将getSupportFragmentManager()。beginTransaction()。add(R.id.fragment_container,overFrag).commit();替换为getSupportFragmentManager()。beginTransaction()。replace(R.id.fragment_container,overFrag)。提交();'。 –

回答

0

尝试使用FrameLayouts,而不是在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:configChanges="keyboardHidden|orientation|screenSize" 
    android:orientation="horizontal" 
    android:id="@+id/activity_main" 
    android:tag="landscape"> 

    <FrameLayout 
     android:id="@+id/overview_fragment" 
     android:layout_weight="1" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" /> 

    <FrameLayout 
     android:id="@+id/details_fragment" 
     android:layout_weight="2" 
     android:layout_width="0dp" 
     android:layout_height="match_parent" /> 

</LinearLayout> 
你的方式

,要创建的每个片段的两倍。 祝你好运:)

+0

谢谢,这解决了重复问题!现在我所要做的就是在风景和肖像作品之间进行转换(: – MrMan

+0

我认为你在纵向或景观模式下检查天气的方式是错误的,现在你有两种不同的布局,你可以检查天气的“details_fragment”容器是可用的。如果它是你在横向模式:private boolean isLandscape(){FramLayout detailsContainer =(FrameLayout)findViewById(R.id.details_fragment); IF(detailsContainer == null){return false;} else {return true ;}} – nir

+0

当你这样做后,你可以在你的MainActivity中使用它:if(isLandscape){... initialize overviewFragment和detailsFragment ...} else {....只初始化overviewFragment .....} – nir