简体   繁体   English

在Android中使用BaseActivity的不同活动中的Common Header

[英]Common Header in different activities using BaseActivity in android

I want write code once and use in different activities. 我想要一次编写代码并在不同的活动中使用。 I have created a Base Activity class for that . 我为此创建了一个Base Activity class Also the header of all the layouts in different activities are same. 此外,不同活动中所有布局的标题都是相同的。 I have done that with the help of the <include layout > tag. 我已经在<include layout >标签的帮助下完成了这项工作。

Now the Problem is my BaseActivity code is not running. 现在的问题是我的BaseActivity代码没有运行。 I am trying this first time se don't have much idea about that. 我这是第一次尝试这个没有太多想法。

1.)The BaseActivity code is below : 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.) The Activity extended the Base Activity 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);
    }
}

So can any one help me where I am doing something wrong. 所以任何人都可以帮助我做错事。

For this you have to create one header.xml which will be included in each and every layout for your activities as follows 为此,您必须创建一个header.xml,它将包含在您的活动的每个布局中,如下所示

header.xml header.xml

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

activity_main.xml activity_main.xml中

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

  <!-- Rest of your views -->

</RelativeLayout>

BaseActivity 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);
  }
}

MainActivity 主要活动

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

You can put as many views you want and manage common things in BaseActivity or BaseListActivity. 您可以在BaseActivity或BaseListActivity中放置所需数量的视图并管理常见事物。

If you are making inheritance with activities and your base activity calls setContentView and after that the real activity calls setContentView the last call will set the layout for activity. 如果要使用活动进行继承,并且基本活动调用setContentView,之后实际活动调用setContentView,则最后一次调用将设置活动的布局。 So if you are looking for a solution where all activies have the same header component the are 2 ways. 因此,如果您正在寻找一种解决方案,其中所有活动具有相同的标题组件,则有两种方式。

  1. For each activity layout xml you include that component 对于每个活动布局xml,您都包含该组件

  2. -You make function for baseActivity eg setContent(int layout_id) -You call that with your activity always. - 你为baseActivity创建函数,例如setContent(int layout_id) - 你总是用你的活动调用它。 -Baseactivity inflates a root view with header and inflates layout_id view to that layout. -Baseactivity使用标头膨胀根视图,并将layout_id视图扩展到该布局。 -Then calls the actual setContentView with that component. - 然后用该组件调用实际的setContentView。

I think you should achieve it using Fragment , this may helps you. 我认为你应该使用Fragment来实现它,这可能会对你Fragment帮助。

1 - in main.xml , add: 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 - the BaseActivity which extends FragmentActivity : 2 - 扩展FragmentActivityBaseActivity

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;
        }
    }
}

3 - Now, you can extend your Activity with the BaseActivity . 3 - 现在,您可以使用BaseActivity扩展Activity This will allow the Activity to be extended by FragmentActivity : 这将允许FragmentActivity扩展Activity

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

In code, your base activity is called ExampleActivity , but in your child class you are extending BaseActivityMenu . 在代码中,您的基本活动称为ExampleActivity ,但在您的子类中,您正在扩展BaseActivityMenu Don't know where its coming from. 不知道它的来源。

Perhaps change: 也许改变:

public class ABCActivity extends BaseActivityMenu

To this: 对此:

public class ABCActivity extends ExampleActivity

Moreover, I would suggest you to define your base activity ( ExampleActivity ) as an Abstract class. 此外,我建议您将基本活动( ExampleActivity )定义为Abstract类。 For example: 例如:

public abstract class ExampleActivity extends Activity

Doing so will not define your base class as concrete and will make it easier to debug in case of problems. 这样做不会将您的基类定义为具体,并且在出现问题时可以更容易地进行调试。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 通过扩展BaseActivity在不同的活动中使用导航抽屉 - Using Navigation Drawer in different Activities by extending BaseActivity 使用BaseActivity在不同活动上使用相同的导航抽屉 - Same Navigation Drawer on different Activities using BaseActivity Android:使用NavigationView作为BaseActivity - Android : Using NavigationView as a BaseActivity 适用于Android中所有活动的通用可点击标题 - Common Clickable Header for All Activities in Android 将Butterknife与BaseActivity / Child活动和MaterialDrawer一起使用 - Using Butterknife with BaseActivity/Child Activities and MaterialDrawer 具有常见工具栏和menuItems活动的BaseActivity无法捕获onMenuItemClick - BaseActivity with common toolbar and menuItems activities can not catch onMenuItemClick Android 将按钮或视图保留在应用内所有活动的前面,而不使用 baseActivity - Android keep button or view in front of all activities within the app without using baseActivity 来自Xamarin android中所有活动的Header点击事件的通用Header - Common Header with click events of Header from all Activities in Xamarin android 所有活动都可以使用BaseActivity吗? - A BaseActivity for all activities, possible? 使用通用对话框,但从android中的不同活动调用不同的函数 - Using a common dialog box, but calling different functions from diffrent activities in android
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM