2

Android アプリを開発しようとしていますが、ActionBar に問題があります。

Android 用の Instagram や Twitter に似たものが必要です。3 つのタブを持つアクション バーがあり、これらのタブにはいくつかのボタンがあります。すべてのボタンには OnClick() があり、 FragmentTransaction (およびメソッド replace()) を使用して、実際のフラグメントを新しいフラグメント (たとえば ''FragmentN'') に置き換えます。

私の最初の問題は、ActionBar からタブを選択すると、選択したタブが「FragmentN」に置き換わらず、一番上に配置されるため、両方のフラグメントが上下に表示され続けることです。

別の問題もありますが、前の問題に関連していると思います...ただし、例を挙げて説明します。ActionBar からタブ A を選択し、このタブからボタン 3 を押すと、「FragmentA3」が「FragmentA」に置き換わります。この後、ActionBar から tabC を選択します。ここで、常に ActionBar からタブ A を再度選択しますが、「FragmentA」を再度表示する代わりに、以前に選択した「FragmentA3」が表示されます。

これらの問題を解決するにはどうすればよいですか? どうもありがとうございました。

編集:これは私のコードです。

主な活動

    import android.os.Bundle;
    import android.annotation.SuppressLint;
    import android.annotation.TargetApi;
    import android.app.ActionBar;
    import android.app.ActionBar.Tab;
    import android.app.Activity;
    import android.app.Fragment;
    import android.app.FragmentTransaction;


    @SuppressLint("NewApi")
    @TargetApi(11)
    public class ABActivity extends Activity {
@Override
     public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ActionBar actionBar = getActionBar(); 
    actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);

    //TAB 1
    Tab tab = actionBar.newTab(); 
    tab.setIcon(R.drawable.p);
    String label1 = "one";
    TabListener<Tab1Fragment> tl1 = new TabListener<Tab1Fragment>(this,
            label1, Tab1Fragment.class);
    tab.setTabListener(tl1);
    actionBar.addTab(tab);

    //TAB2
    tab = actionBar.newTab(); 
    tab.setIcon(R.drawable.m);
    String label2 = "two";
    TabListener<Tab2Fragment> tl2 = new TabListener<Tab2Fragment>(this,
            label2, Tab2Fragment.class);
    tab.setTabListener(tl2);
    actionBar.addTab(tab);

    //TAB3       
    tab = actionBar.newTab(); 
    tab.setIcon(R.drawable.s);
    String label3 = "three";
    TabListener<Tab3Fragment> tl3 = new TabListener<Tab3Fragment>(this,
            label3, Tab3Fragment.class);
    tab.setTabListener(tl3);
    actionBar.addTab(tab);
     }

   private class TabListener<T extends Fragment> implements   ActionBar.TabListener {
  private Fragment mFragment;
  private final Activity mActivity;
  private final String mTag;
  private final Class<T> mClass;

  public TabListener(Activity activity, String tag, Class<T> clz) 
  {
      mActivity = activity;
      mTag = tag;
      mClass = clz;
  }

  public void onTabSelected(Tab tab, FragmentTransaction ft) 
  {
     if (mFragment == null) {
          mFragment = Fragment.instantiate(mActivity, mClass.getName());
          ft.add(android.R.id.content, mFragment, mTag);
      } else {
          ft.attach(mFragment);
      }

      }

  public void onTabUnselected(Tab tab, FragmentTransaction ft) { 
      if (mFragment != null) {
          ft.detach(mFragment);
      }
  }

  public void onTabReselected(Tab tab, FragmentTransaction ft) {
  }} }

Tab1フラグメント

   import android.annotation.SuppressLint;
   import android.app.Fragment;
   import android.app.FragmentTransaction;
   import android.os.Bundle;
   import android.view.LayoutInflater;
   import android.view.View;
   import android.view.ViewGroup;
   import android.widget.Button;
   import android.widget.LinearLayout;

   public class Tab1Fragment extends Fragment {
 Fragment f;
     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    return (LinearLayout) inflater.inflate(R.layout.tab1, container, false);
  }

      @Override
       public void onActivityCreated (Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
f=this;

Button butt = (Button) getActivity().findViewById(R.id.butt);
butt.setOnClickListener(new View.OnClickListener() {

@SuppressLint("NewApi")
public void onClick(View v) {
 Fragment nuovo = new Nuova();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

transaction.replace(android.R.id.content, nuovo);
transaction.addToBackStack("nuovo");

 transaction.commit();
   } });
}
 }

ヌーバ

   import android.app.Fragment;
   import android.os.Bundle;
   import android.view.LayoutInflater;
   import android.view.View;
   import android.view.ViewGroup;
   import android.widget.LinearLayout;

   public class Nuova extends Fragment {

 @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        return (LinearLayout) inflater.inflate(R.layout.nuova, container, false);
    } }

tab1.xml

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/tab1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">


<Button
    android:id="@+id/butt"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Button" />

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="one" />

    </LinearLayout>

nuova.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/nuovo"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical"
      android:gravity="center">

<TextView
    android:id="@+id/textView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:text="nuova" />
 </LinearLayout>
4

2 に答える 2

0

タブの変更時にフラグメントの必要に応じてメソッド detach と attach を使用します。例えば、

public void onTabSelected(Tab tab, FragmentTransaction ft) {
        if (mFragment == null) {
            mFragment = Fragment.instantiate(mActivity, mClass.getName(), mArgs);
            ft.add(android.R.id.content, mFragment, mTag);
        } else {
            ft.attach(mFragment);
        }
    }

次のパスにある Android サンプルの完全なソースを確認できます。android-sdk -> samples -> android-16 -> ApiDemos -> src -> com -> example -> android -> apis -> app -> FragmentTabs.java

于 2012-10-11T16:31:55.453 に答える
0

onClick メソッドの Tab1Fragment で、mFragment インスタンスを新しく作成された nuovo に置き換えます

コンテナに追加された既存のフラグメントを置き換えます。これは、同じ containerViewId で追加された現在追加されているすべてのフラグメントに対して remove(Fragment) を呼び出してから、ここで指定された同じ引数で add(int, Fragment, String) を呼び出すことと基本的に同じです。

(mFragment が別のオブジェクト (nuovo) を参照しているように見えますが、間違っている可能性があります。明日確認します)

したがって、最初にこの行を置き換えます transaction.replace(android.R.id.content, nuovo);

transaction.replace(android.R.id.content, nuovo, "nuovoTag");

次に、 public void onTabSelected(Tab tab, FragmentTransaction ft) を次のコードで変更します。

Fragment fr = getFragmentManager().findFragmentByTag("nuovoTag");
if (fr != null)
  ft.remove(fr);

  if (mFragment == null) {
      mFragment = Fragment.instantiate(mActivity, mClass.getName());
      ft.add(android.R.id.content, mFragment, mTag);
  } else {
      ft.attach(mFragment);
  }
于 2012-10-15T21:55:04.480 に答える