18

一度コードを書いて、いろいろな活動に使ってみたいです。そのためにを作成しBase Activity classました。また、さまざまなアクティビティのすべてのレイアウトのヘッダーは同じです。私は<include layout >タグの助けを借りてそれをしました。

今問題は私のBaseActivityコードが実行されていないことです。私はこれを初めて試していますが、それについてはあまりわかりません。

1.)BaseActivityコードは以下のとおりです。

package com.waheguru.app;

import android.R.integer;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;

import android.view.View;
import android.view.View.OnClickListener;

import android.widget.Button;
import android.widget.Toast;

public abstract class BaseActivityMenu extends Activity {
    //action id
    private static final int ID_UP     = 1;
    private static final int ID_DOWN   = 2;
    private static final int ID_SEARCH = 3;
    private static final int ID_INFO   = 4;
    private static final int ID_ERASE  = 5; 
    private static final int ID_OK     = 6;

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

        setContentView(R.layout.header);

        ActionItem nextItem     = new ActionItem(ID_DOWN, "Book", getResources().getDrawable(R.drawable.menu_down_arrow));
        ActionItem prevItem     = new ActionItem(ID_UP, "Bookmark", getResources().getDrawable(R.drawable.menu_up_arrow));
        ActionItem searchItem   = new ActionItem(ID_SEARCH, "Find", getResources().getDrawable(R.drawable.menu_search));
        ActionItem infoItem     = new ActionItem(ID_INFO, "Info", getResources().getDrawable(R.drawable.menu_info));
        ActionItem eraseItem    = new ActionItem(ID_ERASE, "Clear", getResources().getDrawable(R.drawable.menu_eraser));
        ActionItem okItem       = new ActionItem(ID_OK, "OK", getResources().getDrawable(R.drawable.menu_ok));

        //use setSticky(true) to disable QuickAction dialog being dismissed after an item is clicked
        prevItem.setSticky(true);
        nextItem.setSticky(true);

        //create QuickAction. Use QuickAction.VERTICAL or QuickAction.HORIZONTAL param to define layout 
        //orientation
        final QuickAction quickAction = new QuickAction(this, QuickAction.VERTICAL);

        //add action items into QuickAction
        quickAction.addActionItem(nextItem);
        quickAction.addActionItem(prevItem);
        quickAction.addActionItem(searchItem);
        quickAction.addActionItem(infoItem);
        quickAction.addActionItem(eraseItem);
        quickAction.addActionItem(okItem);

        //Set listener for action item clicked
        quickAction.setOnActionItemClickListener(new QuickAction.OnActionItemClickListener() {          
            public void onItemClick(QuickAction source, int pos, int actionId) {                
                ActionItem actionItem = quickAction.getActionItem(pos);

                //here we can filter which action item was clicked with pos or actionId parameter
                if (actionId == ID_SEARCH) {
                    Toast.makeText(getApplicationContext(), "Let's do some search action", Toast.LENGTH_SHORT).show();
                } else if (actionId == ID_INFO) {
                    Toast.makeText(getApplicationContext(), "I have no info this time", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getApplicationContext(), actionItem.getTitle() + " selected", Toast.LENGTH_SHORT).show();
                }
            }
        });

        //set listnener for on dismiss event, this listener will be called only if QuickAction dialog was dismissed
        //by clicking the area outside the dialog.
        quickAction.setOnDismissListener(new QuickAction.OnDismissListener() {          
            public void onDismiss() {
                Toast.makeText(getApplicationContext(), "Dismissed", Toast.LENGTH_SHORT).show();
            }
        });
        Button books=(Button)findViewById(R.id.book);
        books.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {
                Intent intent=new Intent(ExampleActivity.this,List_of_books.class);
                startActivityForResult(intent, 0);
            }
        });
        //show on btn1
        Button btn1 = (Button) this.findViewById(R.id.menu);
        btn1.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                quickAction.show(v);
            }
        });
    }
}

2.)アクティビティは基本アクティビティを拡張しました

package com.waheguru.app;

import android.app.Activity;
import android.os.Bundle;

public class ABCActivity extends BaseActivityMenu  {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);
    }
}

だから、私が何か間違ったことをしているところに誰かが私を助けることができますか?

4

4 に答える 4

23

このためには、次のように、アクティビティのすべてのレイアウトに含まれる1つのheader.xmlを作成する必要があります。

header.xml

<RelativeLayout>
  <TextView android:id="@+id/txtHeading"
      .... />
</RelativeLayout>

activity_main.xml

<RelativeLayout>
  <!-- include your header here -->
  <include layout="@layout/header"
     ... />

  <!-- Rest of your views -->

</RelativeLayout>

BaseActivity

abstract class BaseActivity extends Activity {
  protected TextView txtHeading;
  public void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
  }


  protected void setHeading(int resId) {
     if(txtHeading == null)
     txtHeading = findViewById(R.id.txtHeading);
     if(txtHeading != null)
       txtHeading.setText(resId);
  }
}

主な活動

class MainActivity extends BaseActivity {
   public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      setHeading(R.string.heading_main);
   }
}

BaseActivityまたはBaseListActivityで、必要な数のビューを配置し、一般的なものを管理できます。

于 2012-07-20T12:55:35.443 に答える
2

アクティビティを継承し、基本アクティビティがsetContentViewを呼び出し、その後、実際のアクティビティがsetContentViewを呼び出す場合、最後の呼び出しでアクティビティのレイアウトが設定されます。したがって、すべてのアクティビティに同じヘッダーコンポーネントがあるソリューションを探している場合は、2つの方法があります。

  1. アクティビティレイアウトxmlごとに、そのコンポーネントを含めます

  2. -baseActivityの関数を作成します(例:setContent(int layout_id))-常にアクティビティで呼び出します。-Baseactivityは、ヘッダー付きのルートビューを拡張し、layout_idビューをそのレイアウトに拡張します。-次に、そのコンポーネントを使用して実際のsetContentViewを呼び出します。

于 2012-07-20T12:59:46.260 に答える
2

私はあなたがそれを使ってそれを達成するべきだと思いますFragment、これはあなたを助けるかもしれません。

1-でmain.xml、追加:

<fragment
    android:id="@+id/header"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    class="com.package.name.HeaderPanel" />

//remaining is same 

2-BaseActivity拡張するFragmentActivity

public class BaseActivityMenu extends FragmentActivity {

    private static final String TAG = Default.class.getName() + " - ";
    private int mResLayoutId;

    public void onCreate(Bundle savedInstanceState, int resLayout){
        super.onCreate(savedInstanceState);
        setContentView(resLayout);
        mResLayoutId = resLayout;
        switch(mResLayoutId){
            // here change with your xml file
            case R.layout.home:
                // set here common control like header textview
                break;
            default:
                break;
        }
    }
}

Activity3-これで、を使用してを拡張できますBaseActivity。これにより、を次のActivityように拡張できFragmentActivityます。

public class ABCActivity extends BaseActivityMenu {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState, R.layout.home);
    }
}
于 2012-07-20T12:59:53.657 に答える
0

コードでは、基本アクティビティはと呼ばExampleActivityれますが、子クラスでは拡張していBaseActivityMenuます。それがどこから来ているのかわからない。

おそらく変更:

public class ABCActivity extends BaseActivityMenu

これに:

public class ABCActivity extends ExampleActivity

ExampleActivityさらに、基本アクティビティ( )を抽象クラスとして定義することをお勧めします。例えば:

public abstract class ExampleActivity extends Activity

そうすることで、基本クラスが具象として定義されず、問題が発生した場合のデバッグが容易になります。

于 2012-07-20T12:48:26.560 に答える