2016-04-19 10 views
10

私はマテリアルデザインアプリに取り組んでいます。私が実装したい機能の1つは、ある種の投票です。ユーザーがリストの要素をクリックすると、永続的なボトムシートダイアログ(thisのように見える)が表示されます。 次に、ユーザーがボタンをクリックすると、このダイアログが消えてモーダルボトムシートダイアログが表示され、最初にクリックされたリスト項目に関する詳細情報がユーザーに表示されます。それはthisのように見えます。BottomSheetDialog/BottomSheetDialogFragment - 使用する方法とは?

AppCompatダイアログに関する情報を読んだ後でも、BottomSheetDialogとBottomSheetDialogFragmentについて明確な説明と、正しく使用する方法が見つかりません。だから、私の質問は以下のとおりです。どのようにして

  1. 彼らは異なっていて、私は、各 場合のどちらを使うべきでしょうか?
  2. ダイアログでどのボタンが押されたのかに関するアクティビティのデータを取得する方法は?
  3. これらのコードの使用に関する実装またはチュートリアルのコードへのリンクはありますか?

答えて

6

最後に、解決策が見つかりました。私が何か悪いことをしているかどうか教えてください。基本的にはthis guideのDialogFragmentのように動作しますが、少し違っています。

1)DialogFragmentとDialogの違いは同じですが、どちらもモーダルです。永続的なダイアログが必要な場合は、BottomSheetBehaviour insteadを使用してください(私は両方のダイアログが私のアプリケーションでモーダルでなければならないことがわかりました)。

2)最初に3番目の質問に答える必要があり、2番目の質問に答えるのは簡単です。

3)新しいpublic classを作成します。extends BottomSheetDialogFragmentという名前のFragmentRandomEventPollを作成しました。ここに実装する必要があるのは2つあります。

  • オーバーライドメソッドonCreateView。それは、それが膨張する必要があるビューを返すことを除いて、活動にonCreate方法とほぼ同じである:

    // We will need it later 
    private static String headerItem; 
    
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
    
    View v = inflater.inflate(R.layout.fragment_random_event_poll, container, false); 
        header = (TextView) v.findViewById(R.id.uRnd_fragment_bottom_sheet_poll_header); 
        skip = (Button) v.findViewById(R.id.uRnd_fragment_bottom_sheet_button_skip); 
        header.setText(...); 
    
        // I implemented View.OnClickListener interface in my class 
        skip.setOnClickListener(this); 
        return v; 
    } 
    
  • あなたに必要なデータを渡すと、このクラスの新しいインスタンスを取得することができstaticメソッド(おそらく私ができます通常のコンストラクタを使用したばかりですが、もう少し試してみる必要があります)。 URandomEventListItemはデータモデルクラスです。 、アクティビティや他の場所での入力イベントを取得する必要なメソッドとのインターフェースを定義し、それは、インスタンスのためにsetterメソッドを作成するには

    public static FragmentRandomEventPoll newInstance(URandomEventListItem item) { 
        FragmentRandomEventPoll fragment = new FragmentRandomEventPoll(); 
        headerItem = item.getHeader(); 
        return fragment; 
    } 
    

2):

private PollButtonClickListener listener; 

public void setListener(PollButtonClickListener listener) { 
    this.listener = listener; 
} 

public interface PollButtonClickListener { 
    void onAnyButtonClick(Object data) 
} 

そして、あなたが望む場所であなたのデータを入手してください( "dialog_event_poll"タグはレイアウトで指定されています):

FragmentRandomEventPoll poll = FragmentRandomEventPoll.newInstance(events.get(id)); 
poll.setListener(new FragmentRandomEventPoll.PollButtonClickListener() { 
     @Override 
     public void onAnyButtonClick(Object data) { 
      // Do what you want with your data 
     } 
    }); 
    poll.show(getSupportFragmentManager(), "dialog_event_poll"); 
} 

叔父プロジェクトファイルはGithubにあります。

関連する問題