2016-05-31 21 views
0

Ich versuche, mehrere Fragment s auf einem Activity zu verwenden. Was ich tue, ist: 1. Fügen Sie das erste dem Activity hinzu. Die erste enthält eine Schaltfläche am unteren Bildschirmrand. 2. Ersetzen Sie es durch die zweite Fragment durch Hinzufügen zum Backstack.Schaltfläche auf dem ersten Fragment bewegt sich aus dem Bildschirm, wenn das zweite Fragment ersetzt

Wenn ich auf dem Boden des ersten Fragment auf die Schaltfläche klicken, wird es gleitet automatisch (ich weiß nicht, warum) und bewegt sich auf den zweiten Fragment:

img1

Wenn ich gehe zurück zu die ersten Fragment durch die zurück-Taste drückt, geht der Knopf im ersten Fragment aus Sicht:

img2

MainActivity

public class MainActivity extends AppCompatActivity implements UserDetailsFragment.UserDetailsFragmentListener, 
     PhotoFragment.PhotoFragmentListener, TestFragment.TestFragmentListener{ 

@Bind(R.id.container) 
FrameLayout frameLayout; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_create_profile); 
    ButterKnife.bind(this); 


    // However, if we're being restored from a previous state, 
    // then we don't need to do anything and should return or else 
    // we could end up with overlapping fragments. 
    if (savedInstanceState != null) { 
     return; 
    } 

    initView(); 
} 

private void initView() { 

    TestFragment testFragment = new TestFragment(); 

    FragmentUtil.replaceFragment(this,R.id.container, testFragment); 
} 

@Override 
public void onProfileDetailCompleted(UserModel userModel) { 
    PhotoFragment photoFragment = PhotoFragment.newInstance(userModel); 
    FragmentUtil.replaceFragment(this, R.id.container, photoFragment); 
} 

@Override 
public void onPhotoUploaded(UserModel userModel) { 

} 

@Override 
public void onSkipPhotoClicked() { 
    PhotoFragment photoFragment = PhotoFragment.newInstance(null); 
    FragmentUtil.replaceFragment(this, R.id.container, photoFragment); 
} 

@Override 
public void onTest() { 
    PhotoFragment photoFragment = PhotoFragment.newInstance(null); 
    FragmentUtil.replaceFragment(this, R.id.container, photoFragment); 
} 

}

TestFragment.java

public class TestFragment extends BaseFragment { 


public TestFragment() { 
    // Required empty public constructor 
} 

public interface TestFragmentListener { 
    void onTest(); 
} 

private TestFragmentListener mListener; 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 
    View view = inflater.inflate(R.layout.fragment_test, container, false); 
    ButterKnife.bind(this, view); 
    return view; 
} 

@OnClick(R.id.next_btn) 
public void onNextButtonClicked() { 
    //TODO validate view 


    if(mListener!=null) 
     mListener.onTest(); 
} 



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

}

FragmentUtils.java

public class FragmentUtil { 

public static boolean hadFragment(AppCompatActivity activity) { 
    return activity.getSupportFragmentManager().getBackStackEntryCount() != 0; 
} 

public static void replaceFragment(AppCompatActivity activity, int contentId, BaseFragment fragment) { 
    FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction(); 

    transaction.setCustomAnimations(R.anim.slide_left_in, R.anim.slide_left_out); 
    if (hadFragment(activity)) { 
     transaction.replace(contentId, fragment, fragment.getClass().getSimpleName()); 
    } else { 
     transaction.add(contentId, fragment, fragment.getClass().getSimpleName()); 
    } 

    transaction.addToBackStack(null); 
    transaction.commit(); 
} 

public static void removeFragment(AppCompatActivity activity, BaseFragment fragment) { 
    activity.getSupportFragmentManager().beginTransaction() 
     .remove(fragment) 
     .commit(); 
} 


public static void showFragment(AppCompatActivity activity, BaseFragment fragment) { 
    activity.getSupportFragmentManager().beginTransaction() 
     .show(fragment) 
     .commit(); 
} 

public static void hideFragment(AppCompatActivity activity, BaseFragment fragment) { 
    activity.getSupportFragmentManager().beginTransaction() 
     .hide(fragment) 
     .commit(); 
} 

public static void attachFragment(AppCompatActivity activity, BaseFragment fragment) { 
    activity.getSupportFragmentManager().beginTransaction() 
     .attach(fragment) 
     .commit(); 
} 

public static void detachFragment(AppCompatActivity activity, BaseFragment fragment) { 
    activity.getSupportFragmentManager().beginTransaction() 
     .detach(fragment) 
     .commit(); 
} 

}

Wenn ich von der zweiten Fragment zum dritten Fragment bewegen (die die gleiche wie die erste ist), die Taste auf der Unterseite des zweiten Bildschirm sieht in Ordnung. Aber der Knopf auf der ersten geht immer noch aus der Sicht. Das Problem besteht nur in der Sicht der ersten . Bitte helfen Sie.

Antwort

0

Ich hatte etwas ähnliches Problem. Ich benutzte das appcompact-Thema und mein unterstes Layout ging aus dem Bildschirm, wenn ich Fragment ersetze. Dann habe ich ein anderes Thema ausprobiert, danach hat es ganz gut funktioniert. Also, wenn Sie auch App kompakt Theme verwenden, dann versuchen Sie ein anderes Thema. Hoffe es wird dein Problem lösen.

Verwandte Themen