1

各アクティビティに対して静的である必要があるレイアウトを含むスーパークラスを備えた Android アプリを持っています。下の図は、私の説明ではなく、より良い方法でこれを示しています

ここに画像の説明を入力

この「ヘッダー」には、tabBarを含む が含まれていますImageButton。アプリ内のすべてのアクティビティに対して、このヘッダーを静的にしたいと考えています。私がやろうとしたことは、extendこのスーパークラスから他のクラスへのアクセスです。スーパークラスのコードは以下にあります

public class MySuperClass extends Activity {
 MyHorizontalScrollView scrollView;
 View menu;
 View app;
 ImageButton btnSlide;
 boolean menuOut = false;
 Handler handler = new Handler();
 int btnWidth;

 Button testClass; 

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

    LayoutInflater inflater = LayoutInflater.from(this);
    scrollView = (MyHorizontalScrollView) inflater.inflate(R.layout.horz_scroll_with_list_menu, null);
    setContentView(scrollView);

    menu = inflater.inflate(R.layout.horz_scroll_menu, null);

    app = inflater.inflate(R.layout.horz_scroll_app, null);
    ViewGroup tabBar = (ViewGroup) app.findViewById(R.id.tabBar);

    ListView listView = (ListView) app.findViewById(R.id.list);

    listView = (ListView) menu.findViewById(R.id.list);

    ArrayList<MenuItem> menuItems = getMenuItems();
    listView.setAdapter(new MenuCustomAdapter(this, menuItems)); 

    btnSlide = (ImageButton) tabBar.findViewById(R.id.BtnSlide);
    btnSlide.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch(event.getAction()) {

            case MotionEvent.ACTION_DOWN:
                btnSlide.setImageResource(R.drawable.lincolor);
                break;
            case MotionEvent.ACTION_UP:
                btnSlide.setImageResource(R.drawable.lin);
                break;
            }

            return false;
        }


    });
    btnSlide.setOnClickListener(new ClickListenerForScrolling(scrollView, menu));

    testClass = (Button) app.findViewById(R.id.button1);

    testClass.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {

            Intent intent = new Intent(MySuperClass.this, TestClass.class);
            startActivity(intent); 
        }


    });

    final View[] children = new View[] { menu, app };

    // Scroll to app (view[1]) when layout finished.
    int scrollToViewIdx = 1;
    scrollView.initViews(children, scrollToViewIdx, new SizeCallbackForMenu(btnSlide));
}

public ArrayList<MenuItem> getMenuItems() {
    ArrayList<MenuItem> items = new ArrayList<MenuItem>();


    MenuItem m1 = new MenuItem(R.drawable.scroll, "Show history"); 
    items.add(m1);
    MenuItem m2 = new MenuItem(R.drawable.right, "Right"); 
    items.add(m2);

    return items;
}


/**
 * Helper for examples with a HSV that should be scrolled by a menu View's width.
 */
static class ClickListenerForScrolling implements OnClickListener {
    HorizontalScrollView scrollView;
    View menu;
    ImageButton button;
    int pressed;
    int timeout;
    /**
     * Menu must NOT be out/shown to start with.
     */
    boolean menuOut = false;

    public ClickListenerForScrolling(HorizontalScrollView scrollView, View menu) {
        super();
        this.scrollView = scrollView;
        this.menu = menu; 
    }



    @Override
    public void onClick(View v) {
        Context context = menu.getContext();

        int menuWidth = menu.getMeasuredWidth();

        // Ensure menu is visible
        menu.setVisibility(View.VISIBLE);

        if (!menuOut) {
            // Scroll to 0 to reveal menu
            int left = 0;
            scrollView.smoothScrollTo(left, 0);
        } else {
            // Scroll to menuWidth so menu isn't on screen.
            int left = menuWidth;
            scrollView.smoothScrollTo(left, 0);
        }
        menuOut = !menuOut;
    }


}

/**
 * Helper that remembers the width of the 'slide' button, so that the 'slide' button remains in view, even when the menu is
 * showing.
 */
static class SizeCallbackForMenu implements SizeCallback {
    int btnWidth;
    View btnSlide;

    public SizeCallbackForMenu(View btnSlide) {
        super();
        this.btnSlide = btnSlide;
    }

    @Override
    public void onGlobalLayout() {
        btnWidth = btnSlide.getMeasuredWidth();
        System.out.println("btnWidth=" + btnWidth);
    }

    @Override
    public void getViewSize(int idx, int w, int h, int[] dims) {
        dims[0] = w;
        dims[1] = h;
        final int menuIdx = 0;
        if (idx == menuIdx) {
            dims[0] = w - btnWidth;
        }
    }
}

}

そして、このスーパークラスを拡張するテスト クラス。

public class TestClass extends MySuperClass {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);

}

}

繰り返しますがtabBar、各アクティビティの静的を作成するにはどうすればよいですか?

4

3 に答える 3

1

それが可能かどうかはわかりません。もう少しコードが必要ですが、機能し、ベスト プラクティスである代替ソリューションを投稿します。

あなたが言及しているタブバーのように、特定のレイアウトを何度も使用しようとしている場合、レイアウトには機能が<merge>あり<include>ます。基本的な考え方はlayout.xml、他のレイアウトに含めたいファイルを作成することです。

この投稿は、それを使用する方法の非常に良い例を示しています。Android XML レイアウトでの <merge> と <include> の使用の簡単な例

于 2012-07-23T08:05:18.037 に答える
1

アクティビティスコープでこれを達成する方法はありません。レイアウトはアクティビティから独立しています (まあ、それらをバインドするまで)。

問題の解決策は、次のような、レイアウト フォルダーの下の xml ファイルに保存されている一般的なヘッダー レイアウトを使用することです。

header.xml:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@android:color/red"
    ... />

include タグを使用して、それらをレイアウトに含めます。

my_activity_layout.xml:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    ....
    .... >

    <include layout="@layout/header.xml" android:id="@+id/header" />

    <!-- Countinue your layout .... -->

</RelativeLayout>
于 2012-07-23T08:06:17.707 に答える
1

TabHost 権限を使用できます。各タブをクリックすると、個別のアクティビティを起動できます

http://mfarhan133.wordpress.com/2010/11/17/tablayouttabhost-tutorial-for-android-reusing-layout/

于 2012-07-23T08:01:46.913 に答える