Android簡易パッケージエラー時のデフォルトの展示ページ

8468 ワード

プロジェクトでは、ページの読み込みエラーが発生することがよくあります.ページの読み込みにはデータがなく、ネットワークがないなどです.これらの場合は、ユーザーに通知するための特別な展示が必要であり、クリックイベントを提供して再読み込みするなどの状況が必要である.一般的にはレイアウトの上に直接にレイアウトをかぶせてこのような状況を展示します.もしページが一つしかないならば、或いは少しのページでこのようにしても簡単です.しかし、大量のページが必要であれば、私達のxmlはどうしてもポイントの階層が多すぎて、読みにくいです.previewの時に私達が本当に展示したいページの構造が見えないかもしれません.これに基づいて、皆さんと一緒に勉強する態度に基づいて、簡単なコードを書いてパッケージにします.
その中の原理は先に鴻洋大神のこのブログAndroidのソースコード解析のset ContentViewを読むことができます.
private FrameLayout mFrameLayout; //    android   setContentView        
private View mDefaultView; //          ,            
private View mContentView;//                

@Override
public void setContentView(@LayoutRes int layoutResID) {
    mFrameLayout = (FrameLayout) findViewById(android.R.id.content);
        
    mDefaultView = LayoutInflater.from(activity).inflate(R.layout.default_layout, mFrameLayout, false);//  defaul_layout            
        
    mContentView = LayoutInflater.from(activity).inflate(layoutResID, mFrameLayout, false);//  layoutResId              
    
    //               mFramLayout  ,       
    mFrameLayout.addView(mContentView);
    mFrameLayout.addView(mDefaultView);
    mDefaultView.setVisibility(View.GONE);
}

/**
*
**
/
protected void showDefaultView() {
    mDefaultView.setVisibility(View.VISIBLE);
    mContentView.setVisibility(View.GONE);
}

protected void hideDefaultView() {
    mDefaultView.setVisibility(View.GONE);
    mContentView.setVisibility(View.VISIBLE);
}

R.layout.default_ラyoutのレイアウトファイルは以下の通りです.



    

    


このデフォルトのレイアウトは、私が違ったら?例えば、インターネットで間違った画像をロードしたり、コンテンツを取得していない画像をどうやって修正すればいいですか?
    private ImageView defaultImage;
    private TextView defaultText;
    
    
    /**
     * @param drawableResID        
     * @param text                 
     * @param listener             
     *
     *        drawableResID,     textView     ,      image        ,       。      
     */
    protected void initDefaultView(@DrawableRes int drawableResID, String text, View.OnClickListener listener) {
        defaultImage = (ImageView) findViewById(R.id.default_image_view);
        defaultText = (TextView) findViewById(R.id.default_text_view);

        if (drawableResID <= 0) {
            defaultImage.setVisibility(View.GONE);
        } else {
            defaultImage.setVisibility(View.VISIBLE);
            defaultImage.setImageResource(drawableResID);
        }

        if (TextUtils.isEmpty(text)) {
            defaultText.setVisibility(View.GONE);
        } else {
            defaultText.setVisibility(View.VISIBLE);
            defaultText.setText(text);
        }

        if (listener != null) {
            mDefaultView.setOnClickListener(listener);
        }
    }
もしプロジェクトの中にあるページのエラーページが比較的簡単で、あるものは比較的に複雑で、あるいは配置様式は根本的にデフォルトのレイアウトとすでに千差万別になりました.どうすればいいですか?
上のコードを変えます.まず一つの方法を定義します.標準は空に戻ります.
    protected View useCustomLayout() {
        return null;
    }
    @Override
    public void setContentView(@LayoutRes int layoutResID) {
        mFrameLayout = (FrameLayout) findViewById(android.R.id.content);
        //            useCustomLayout    ,     ,    defaultView        view  
        if (useCustomLayout() == null) {
            mDefaultView = LayoutInflater.from(activity).inflate(R.layout.default_layout, mFrameLayout, false);
        } else {
            mDefaultView = useCustomLayout();
        }

        mContentView = LayoutInflater.from(activity).inflate(layoutResID, mFrameLayout, false);
      
        mFrameLayout.addView(mDefaultView);
        mFrameLayout.addView(mContentView);
        mDefaultView.setVisibility(View.GONE);
       
    }
完全コードは以下の通りです
import android.support.annotation.LayoutRes;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;

import minihou.net.library.R;

/**
 * Created by monking-macbook
 * on 2017/6/13
 * in MiniHouBaseCore
 * description: use a dialog to introduce this class
 */

public class MiniHouBaseActivity extends AppCompatActivity {

    protected Activity activity;

    private FrameLayout mFrameLayout;

    private View mDefaultView;
    private View mContentView;
    private ImageView defaultImage;
    private TextView defaultText;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        activity = this;
    }

    @Override
    public void setContentView(@LayoutRes int layoutResID) {
        mFrameLayout = (FrameLayout) findViewById(android.R.id.content);
        if (useCustomLayout() == null) {
            mDefaultView = LayoutInflater.from(activity).inflate(R.layout.default_layout, mFrameLayout, false);
        } else {
            mDefaultView = useCustomLayout();
        }

        mContentView = LayoutInflater.from(activity).inflate(layoutResID, mFrameLayout, false);
        mFrameLayout.addView(mDefaultView);
        mFrameLayout.addView(mContentView);
        mDefaultView.setVisibility(View.GONE);
    }

    protected View useCustomLayout() {
        return null;
    }


    /**
     * @param drawableResID        
     * @param text                 
     * @param listener             
     */
    protected void initDefaultView(@DrawableRes int drawableResID, String text, View.OnClickListener listener) {
        if (useCustomLayout() != null) {
                return;
        }
        defaultImage = (ImageView) findViewById(R.id.default_image_view);
        defaultText = (TextView) findViewById(R.id.default_text_view);

        if (drawableResID <= 0) {
            defaultImage.setVisibility(View.GONE);
        } else {
            defaultImage.setVisibility(View.VISIBLE);
            defaultImage.setImageResource(drawableResID);
        }

        if (TextUtils.isEmpty(text)) {
            defaultText.setVisibility(View.GONE);
        } else {
            defaultText.setVisibility(View.VISIBLE);
            defaultText.setText(text);
        }

        if (listener != null) {
            defaultImage.setOnClickListener(listener);
        }
    }

    /**
     *       show                   
     */
    protected void showDefaultView() {
        mDefaultView.setVisibility(View.VISIBLE);
        mContentView.setVisibility(View.GONE);
    }

    /**
     *       ,            ,        。
     */
    protected void hideDefaultView() {
        mDefaultView.setVisibility(View.GONE);
        mContentView.setVisibility(View.VISIBLE);
    }

}
使い方
まずActivityを作成し、上記Activityを引き継ぎます.
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //        setContentView
        if(true){//       ,         
            hideDefaultView();
        }else{
            showDefaultView();
        }
    }
アイコンとテキストを変更したい場合は、クリックイベントを追加します.
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        initDefaultView(R.drawable.new_icon, "      ", new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "      ", Toast.LENGTH_SHORT).show();
            }
        });
    }       
自分でレイアウトを定義する必要があるなら
    @Override
    protected View useCustomLayout() {
        View view=LayoutInflater.from(MainActivity.this).inflate(R.layout.custom_layout, null);
        return view;
    }
はい、必要な学生が来たら試してみてもいいです.もし改善があれば、下にメッセージをください.